计算浮动值
tclsh
% expr 0.2+0.2
0.4
% expr 0.2+0.1
0.30000000000000004
%
为什么不0.3?
我错过了一些东西。 提前谢谢。
答案 0 :(得分:5)
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]
答案 1 :(得分:0)
这种行为几乎存在于所有编程语言中,例如: Ruby,Python等
这里的建议是尽量避免在浮点数中存储数字,尽可能使用整数。底线是不要在比较中使用浮点数。