带小数点的金额计算你还在用double?那你就大错特错了

在商业计算中,比如尤其是电商这块,你要算两个商品的价格,可能是优惠前和优惠后的差价。很多程序员,尤其是没怎么接触过这个行业的程序员都会使用double来描述一个金额。于是便出现了下面这个...

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

很多程序员,尤其是没怎么接触过这个行业的程序员都会使用double来描述一个金额。

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

public static void main(String[] args) {
	double priceA = 0.03;
	double priceB = 0.02;
	System.out.println(priceA - priceB);
}

这个算出来是多少。

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

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

QQ截图20170927115445.jpg


为什么是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


  • 发表于 2017-09-27 12:53
  • 阅读 ( 1373 )
  • 分类:Java基础

条评论

请先 登录 后评论
不写代码的码农
三叔

422 篇文章

作家榜 »

  1. 小编 文章
返回顶部
部分文章转自于网络,若有侵权请联系我们删除