标签:
看了 顾森 的文章,拿起自己的魅族用自带的calc试了下,BUG早已经被修复.
C/C++刷题的时候判断浮点数相等直接用等号被坑过好多次,甚至有一回输出 -0.0
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
用python(x,y)试了一下
>>> print 1.3-1.2-.1
8.32667268469e-17
>>> print 1.2-1.1-.1
-1.38777878078e-16
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Java
System.out.println(1.3-1.2-0.1);
System.out.println(1.3F-1.2F-0.1F);
System.out.println(BigDecimal.valueOf(1.3).subtract(BigDecimal.valueOf(1.2)).subtract(BigDecimal.valueOf(0.1)));
8.326672684688674E-17
-9.685755E-8
0.0
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
根本原因还是小数不一定能够用二进制浮点数精确表示,也就是说有些小数只能在精度内尽可能用最相近的二进制浮点数表示,所以会有误差
Java的话有现成的BigDecimal可以用
不然的话还是用C判断浮点数相等的老办法----控制精度
假如减数和被减数的小数位数都在10位以内,加一个判断,若 fabs(a-b)<1e-10 输出0.0
标签:
原文地址:http://www.cnblogs.com/syzhd/p/4313847.html