美文网首页
Java里你还在用double作为价格的字段类型?你犯了大错了!

Java里你还在用double作为价格的字段类型?你犯了大错了!

作者: Web前端学习营 | 来源:发表于2018-12-07 18:52 被阅读33次

    在商业计算中,比如尤其是电商这块,你要算两个商品的价格,可能是优惠前和优惠后的差价。

    很多程序员,尤其是没怎么接触过需要商业价格运算的行业的程序员都会使用double来描述一个金额。

    于是便出现了下面这个计算

    public static void main(String[] args) {

    double priceA = 0.03;double priceB = 0.02;

    System.out.println(priceA - priceB);

    }

    这个算出来是多少。

    我保证肯定有很多人会说:"0.01呀,这还用问么?"。

    然而真实运行出来的结果却是:

    如果有想学习java的程序员,可来我们的java学习扣qun:94311,1692免费送java的视频教程噢!我整理了一份适合18年学习的java干货,送给每一位想学的小伙伴,并且每天晚上8点还会在群内直播讲解Java知识,欢迎大家前来学习哦。

    为什么是0.009999999999999998 而不是0.01

    因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中, 往往难以确定。

    常见的问题是定义了一个浮点数, 经过一系列的计算, 它本来应该等于某个确定值, 但实际上并不是!

    金额必须是完全精确的计算, 故不能使用double或者float, 而应该采用java.math.BigDecimal。

    在《Effective Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。而且使用BigDecimal类也可以进行大数的操作。

    BigDecimal具体的操作参见:https://www.hellojava.com/article/128

    所以改成如下代码:

    public static void main(String[] args) {

    BigDecimal priceA = BigDecimal.valueOf(0.03);

    BigDecimal priceB = BigDecimal.valueOf(0.02);

    System.out.println(priceA.subtract(priceB));

    }

    运行出来的结果就对了。

    以上代码运行出来的结果就是:

    0.01

    更多技术讨论,欢迎加入我们的Java新手群:294557894,常年有大神活跃。

    相关文章

      网友评论

          本文标题:Java里你还在用double作为价格的字段类型?你犯了大错了!

          本文链接:https://www.haomeiwen.com/subject/otjxhqtx.html