如果我将其输入八度:
a = 8*10^-5;
b = 8.0e-005;
a==b
我得到答案:
ans = 1
但如果我把它输入八度:
a = 3*10^-5;
b = 3.0e-005;
a==b
我得到了这个答案
ans = 0
我错过了什么吗?这不是测试平等的正确方法吗?
答案 0 :(得分:3)
这是在涉及浮点数的计算过程中精度损失的结果,例如在Java 3 * Math.pow(10, -5)
中会给你'2.9999999999999997E-5',它在第二个例子中不再匹配b。这与在表达式求值期间如何表示和演化浮点值有关。对于更精细的观点,您可以使用您用于评估这些表达式的上下文/环境来进行谷歌“精度损失”后缀。希望这会有所帮助。
答案 1 :(得分:1)
这是浮点数在计算机系统中表示的常见问题。
许多十进制“圆”的数字在计算机使用的二进制表示中变成重复分数,并且它们必须在某些时候被截断,以获得非常轻微的精度损失。如果两个浮点数以不同方式到达,则必须将它们与一点点斜率进行比较,例如: abs(a-b) < EPSILON
其中EPSILON
是一个适当的常量,如1e-12。