购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

陷阱2

差值损失
——浮点数相减造成的损失

对于浮点数相减,有时结果是正确的,有时结果是不正确的,所以在使用浮点数进行相减运算时,一定要注意应用的领域,特别是对于一些精密仪器的计算、导弹运行轨迹的运算以及航空母舰的运行轨迹,等等,一定要保证结果的正确性,稍有差异可能就会造成很大偏差或脱离轨道,由此造成的损失将是巨大的。

接下来通过两个示例来说明浮点数相减的结果有时是正确的,而有时是不正确的。

(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类来实现。

编程准则:尽量将浮点数相减转换为整数相减

在进行浮点数相减运算时,除非对精度要求不高,否则应该将浮点数转换为整数,然后再对转换后的整数进行相减运算,最后再对计算结果进行处理,将其转换为浮点数,这样就可以得到精确的结果。 DGmMEB+eZ8yRFBl/umKie40tbKKPJT7m1aHDhIpudu2XK6jNGQztnhi1ZkpdyKSY

点击中间区域
呼出菜单
上一章
目录
下一章
×