BigDecimal
在《Effective Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal一共有4个够造方法,我们不关心用BigInteger来够造的那两个,那么还有两个, 它们是:
BigDecimal(double val)
Translates a double into a BigDecimal.
BigDecimal(String val)
Translates the String repre sentation of a BigDecimal into a BigDecimal.
上面的API简要描述相当的明确,而且通常情况下,上面的那一个使用起来要方便一些。我们可能想都不想就用上了,会有什么问题呢?等到出了问题的时候,才 发现上面哪个够造方法的详细说明中有这么一段:
Note: the results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .1000000000000000055511151231257827021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances nonwithstanding.
The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal(".1") is exactly equal to .1, as one would expect. Therefo
Float或Double浮点型计算导致小数点后面显示过长数据的解决方法
最新推荐文章于 2022-02-23 10:49:42 发布
本文探讨了Java中使用float和double进行计算时可能出现的精度问题,并推荐使用BigDecimal进行精确计算。详细解释了BigDecimal的构造方法,特别是使用double构造可能导致的不准确性。提出了解决方案,即通过String构造BigDecimal来进行精确运算,并提供了一个名为Arith的工具类,简化了浮点数的加减乘除和四舍五入操作。
摘要由CSDN通过智能技术生成