计算浮点值
tclsh
% expr 0.2+0.2
0.4
% expr 0.2+0.1
0.30000000000000004
%
为什么不是0.3??
我错过了什么吗。提前致谢。
计算浮点值
tclsh
% expr 0.2+0.2
0.4
% expr 0.2+0.1
0.30000000000000004
%
为什么不是0.3??
我错过了什么吗。提前致谢。
0.1 或 0.2 在 IEEE 双精度二进制浮点算术中都没有精确的表示(Tcl 在内部用于涉及小数值的表达式,因为它们有很好的硬件支持)。这意味着您正在计算的值永远不是您认为的那样。相反,它们都稍微多一点(碰巧;它们通常也可能稍微少一点)。当您添加 0.2+ε 1 +0.1+ε 2时,可能会发生 ε 1 +ε 2可以加起来超过阈值,其中 0.3(另一个不精确表示的值)成为它上面的下一个精确表示的值。这是你观察到的。它也是浮点数学在多种语言中工作的方式所固有的。只有整数算术(或能够表示为 2 的某个幂的精确倍数的小数算术,例如 0.5、0.25、0.125)才能保证是精确的。
这里唯一需要注意的是,Tcl 8.5 和 8.6 更喜欢在重新解析时使用最少的位数来呈现浮点数,以便在重新解析时返回准确的值。如果您想获得固定位数(例如 8 位),请尝试format
在转换时使用:
format %.8f [expr 0.2+0.1]
这种行为几乎存在于所有编程语言中,例如 Ruby、Python 等。
这里的建议是尽量避免将数字存储在浮点数中,尽可能使用整数。底线是不要在比较中使用浮点数。