对于浮点数相减,有时结果是正确的,有时结果是不正确的,所以在使用浮点数进行相减运算时,一定要注意应用的领域,特别是对于一些精密仪器的计算、导弹运行轨迹的运算以及航空母舰的运行轨迹,等等,一定要保证结果的正确性,稍有差异可能就会造成很大偏差或脱离轨道,由此造成的损失将是巨大的。
接下来通过两个示例来说明浮点数相减的结果有时是正确的,而有时是不正确的。
(1)计算结果正确的示例
示例:
说 明
上面示例输出result的值是 0.9,这种情况属于正常的结果,因为确实 1.00 减去 0.10 的差应该是 0.9。
(2)计算结果不正确的示例
示例:
说 明
上面示例输出result的值是 0.3999999999999999,这种情况属于不正确的结果,因为3.00 减去 2.60 的正确差值应该是 0.4。
由于浮点数相减结果错误,很有可能会造成不可估量的损失,尤其是对于一些精密的计算,因此必须要对浮点数相减运算进行处理,使其能计算出正确的结果。
下面是能够保证浮点数相减计算结果正确的两种方法。
(1)使用BigDecimal类
使用BigDecimal类对浮点数进行封装,然后通过该类的subtract()方法计算两个数的差,这样就可以保证计算结果的正确性,但是前提是一定要用String类型形参的构造方法,而不要用其他类型形参的构造方法创建BigDecimal对象,否则也会出现结果不正确的现象。
示例:
说 明
上面示例输出value的值是 0.4,这是正确的结果,从而解决了浮点数相减错误的问题,但是这种做法可能会造成程序运行速度的下降,因为该类并没有很好地得到Java语言的支持。
(2)转换为整数
由于BigDecimal类没有很好地得到Java语言的支持,因此可以使用另一种方法来解决浮点数相减的问题,那就是将原来的数转换为整数,例如,将 3.00 和 2.60 各乘以 100,并将结果强制转换为int型或long型,然后对整数做减法运算,并将运算结果转换为浮点数,方法是用差值除以 100.0,从而得到最终的结果,这种做法程序的运行速度较快。
示例:
说 明
上面示例输出dbResult的值是 0.4,这是正确的结果,从而解决了浮点数相减错误的问题,并且这种做法速度更快,因此,对于频繁的浮点数相减运算就应尽量采用这种方法来实现,当然计算频率较少时,可以使用BigDecimal类来实现。
编程准则:尽量将浮点数相减转换为整数相减
在进行浮点数相减运算时,除非对精度要求不高,否则应该将浮点数转换为整数,然后再对转换后的整数进行相减运算,最后再对计算结果进行处理,将其转换为浮点数,这样就可以得到精确的结果。