电商金额计算的 4 个坑,千万注意了!电商金额计算的 4 个坑,千万注意了!

沙海 2021年5月30日04:15:29Java评论28字数 3594阅读11分58秒阅读模式
摘要

速读摘要

速读摘要文章源自JAVA秀-https://www.javaxiu.com/27565.html

电商项目开发时肯定少不了金额计算,金额计算时有很多让人坑人的地方,在此记录,以免被坑。在java开发中可以通过BigDecimal进行数值类型的计算,详细可到BigDecimal工具类。如上所示,因为太多的人都知道字符串类型不能用双等号进行比对,要用eq方法进行比对其value。发现可能存在除以0的场景要特别注意,程序不会抛出异常,竟然会返回一个字符串!MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/27565.html

原文约 3728 | 图片 6 | 建议阅读 8 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/27565.html

电商金额计算的 4 个坑,千万注意了!电商金额计算的 4 个坑,千万注意了!

点击关注 ? Java基基 文章源自JAVA秀-https://www.javaxiu.com/27565.html

收录于话题文章源自JAVA秀-https://www.javaxiu.com/27565.html

#Java基基文章源自JAVA秀-https://www.javaxiu.com/27565.html

116个文章源自JAVA秀-https://www.javaxiu.com/27565.html

点击上方“Java基基”,选择“设为星标”文章源自JAVA秀-https://www.javaxiu.com/27565.html

做积极的人,而不是积极废人!文章源自JAVA秀-https://www.javaxiu.com/27565.html

文章源自JAVA秀-https://www.javaxiu.com/27565.html

源码精品专栏文章源自JAVA秀-https://www.javaxiu.com/27565.html

 文章源自JAVA秀-https://www.javaxiu.com/27565.html

文章源自JAVA秀-https://www.javaxiu.com/27565.html

来源:blog.csdn.net/qq_30285985/文章源自JAVA秀-https://www.javaxiu.com/27565.html

电商金额计算的 4 个坑,千万注意了!电商金额计算的 4 个坑,千万注意了!文章源自JAVA秀-https://www.javaxiu.com/27565.html

前言

电商项目开发时肯定少不了金额计算,金额计算时有很多让人坑人的地方,在此记录,以免被坑。文章源自JAVA秀-https://www.javaxiu.com/27565.html

1、多精度计算问题

多精度不能直接计算,会存在经度缺失的问题。文章源自JAVA秀-https://www.javaxiu.com/27565.html

public static void main (String[] args) {  double num1 = 1;  double num2 = 31.2;  double num3 = 323.03;  System.out.println (num1+num2+num3);  /**   * 355.22999999999996   */}

如上代码,3 个数值想加之后却得出了一个很长的数值。文章源自JAVA秀-https://www.javaxiu.com/27565.html

在 java 开发中可以通过 BigDecimal 进行数值类型的计算,详细可到 BigDecimal 工具类。文章源自JAVA秀-https://www.javaxiu.com/27565.html

数据库也是一样,mysql中有float和double类型,通过sql直接累加数据也会有精度缺失的情况。如果要精确的数值计算,要使用mysql的decimal类型。文章源自JAVA秀-https://www.javaxiu.com/27565.html

2、包装类型比对

public static void main(String[] args) {     Integer i1 = 100;     Integer i2 = 100;     Integer i3 = 200;     Integer i4 = 200;     System.out.println(i1==i2); // true     System.out.println(i3==i4);  // false}

如上代码很神奇,同样是数值比对100的时候可以通过双等号返回true。200就返回false。文章源自JAVA秀-https://www.javaxiu.com/27565.html

这是因为Integer的valueOf()方法。文章源自JAVA秀-https://www.javaxiu.com/27565.html

//Integer的valueOf方法public static Integer valueOf(int i) {    if (i >= IntegerCache.low && i <= IntegerCache.high)        return IntegerCache.cache[i + (-IntegerCache.low)];    return new Integer(i);}

在[-128,128]之间的数,可以通过双等于比对成功,之外的数值就会返回一个new一个新的Integer,因此会返回false。Double的比较就简单一点,双等于比对全是false。这是因为Double直接是返回了一个新的Double。文章源自JAVA秀-https://www.javaxiu.com/27565.html

//Double的valueOf方法public static Double valueOf(String s) throws NumberFormatException {    return new Double(parseDouble(s));}

在数值比对的时候乱的样子,那我发现他们都有eq方法,通过这个方法比对可以吗?文章源自JAVA秀-https://www.javaxiu.com/27565.html

可以的,不管是Integer还是Double都存在一个equas方法,通过这个方法即可进行数值比对。但是这个方法不是很完美。文章源自JAVA秀-https://www.javaxiu.com/27565.html

public static void main (String[] args){  Double i1 = 100d;  System.out.println(i1.equals ("100"));  //false}

如上所示,因为太多的人都知道字符串类型不能用双等号进行比对,要用eq方法进行比对其value。文章源自JAVA秀-https://www.javaxiu.com/27565.html

这样会让很多人误以为Integer和Double类型也是如此,而且在编码的时候如上这种写法也没有报错,会认为都是100肯定会返回true。恰巧这种想法是错误的。文章源自JAVA秀-https://www.javaxiu.com/27565.html

public boolean equals(Object obj) {    return (obj instanceof Double)           && (doubleToLongBits(((Double)obj).value) ==                  doubleToLongBits(value));}

Double的eq方法入参是Object类型,因此不管传入什么类型都不会报错。i1.equals ("100")这种就是双精度和字符进行比对,这两个永远都不可能返回true。正确的写法应该是i1.equals (100d)。文章源自JAVA秀-https://www.javaxiu.com/27565.html

但是尽管多次提醒,但是还是会有不认真的开发小伙伴错误,因此,可以使用Double.compareTo方法,这个方法和eq方法类似,但是有编译的异常,这样可有效的提醒开发人员。文章源自JAVA秀-https://www.javaxiu.com/27565.html

public static void main (String[] args){  Double i1 = 100d;  System.out.println(i1.compareTo (100d)); //0  System.out.println(i1.compareTo (1d));  //1}

3、除以0会怎样?

小学的时候就讲过,进行除法运算时,除以0是没有意义的,开发过程中也是如此, 发现可能存在除以0的场景要特别注意,程序不会抛出异常,竟然会返回一个字符串!虽然这种场景不多,但是还是需要了解一下。文章源自JAVA秀-https://www.javaxiu.com/27565.html

1除以0的场景:文章源自JAVA秀-https://www.javaxiu.com/27565.html

public static void main(String[] args) {  Double d = 1d;  double v = d / 0d;  System.out.println(v);  //Infinity}

0除以0的场景:文章源自JAVA秀-https://www.javaxiu.com/27565.html

public static void main(String[] args) {  Double d = 0d;  double v = d / 0d;  System.out.println(v);  //NaN}

4、float转double

public static void main(String[] args) { Float f = 12312.12f; System.out.println(f.doubleValue()); System.out.println(Double.parseDouble (f.toString ())); //12312.1201171875 //12312.12}

Float类中有一个doubleValue方法,返回值是一个double类型,这样会很容易的以为这是float转换double类型。但是转换之后精度缺失了,只能乖乖的换一种方式转换。文章源自JAVA秀-https://www.javaxiu.com/27565.html

欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢文章源自JAVA秀-https://www.javaxiu.com/27565.html

电商金额计算的 4 个坑,千万注意了!电商金额计算的 4 个坑,千万注意了!文章源自JAVA秀-https://www.javaxiu.com/27565.html

已在知识星球更新源码解析如下:文章源自JAVA秀-https://www.javaxiu.com/27565.html

电商金额计算的 4 个坑,千万注意了!电商金额计算的 4 个坑,千万注意了!文章源自JAVA秀-https://www.javaxiu.com/27565.html

电商金额计算的 4 个坑,千万注意了!电商金额计算的 4 个坑,千万注意了!文章源自JAVA秀-https://www.javaxiu.com/27565.html

电商金额计算的 4 个坑,千万注意了!电商金额计算的 4 个坑,千万注意了!文章源自JAVA秀-https://www.javaxiu.com/27565.html

电商金额计算的 4 个坑,千万注意了!电商金额计算的 4 个坑,千万注意了!文章源自JAVA秀-https://www.javaxiu.com/27565.html

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。文章源自JAVA秀-https://www.javaxiu.com/27565.html

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。文章源自JAVA秀-https://www.javaxiu.com/27565.html

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。文章源自JAVA秀-https://www.javaxiu.com/27565.html

文章源自JAVA秀-https://www.javaxiu.com/27565.html

文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)
文章源自JAVA秀-https://www.javaxiu.com/27565.html

阅读原文文章源自JAVA秀-https://www.javaxiu.com/27565.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定