为什么金额计算必须用BigDecimal?

金额计算不能用doube!!!!

金额计算必须用BigDecimal,下面对比一下用double 跟BigDecimal的区别。先看一个小例子:

请看题:

示例1

问, 结果是多少? 0.01?

No! 结果是0.009999999999999998!

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

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

double相减会转换成二进制,因double有效位数为16位这就会出现存储小数位数不够的情况,小数的二进制有时并不能精确表示。

这种情况下就会出现误差,解决方法就是使用BigDecimal,它的有效长度足够长可存储小数位数。

因此可代替double来进行加减乘除,金额必须是完全精确的计算,故不能使用double或者float,而应该采用java.math.BigDecimal。

 

总结:

因为计算机是以二进制存储数值的,对于浮点数也是。对于计算机而言,0.1无法精确表达,这就是为什么浮点数会导致精确度缺失的。因此,金额计算,一般都是用BigDecimal 类型。

posted @ 2021-03-05 23:06  gaopengpy  阅读(977)  评论(0编辑  收藏  举报