我的问题的简短版本是:
x
什么被认为是“最佳实践”来决定浮点数何时Math.round(x)
可以被认为是相等的,从而允许浮点运算的精度损失?
冗长的版本是:
我经常需要决定是否x
应该将给定的浮点值“视为整数”,或者更迂腐地说,是否应“视为整数的浮点表示”。
(例如,如果n是整数,则数学表达式
日志10 (10 n )
是表示相同整数n的复杂方式。这就是促使说类似浮点计算的结果可以被视为“整数的表示”的想法。)
任何时候做决定都很容易Math.round(x) == x
每当评估为true
:在这种情况下,我们可以说它x
确实是整数(的浮点表示)。
但是测试Math.round(x) == x
当它评估为 时,测试是不确定的false
。例如,
function log10(x) { return Math.log(x)/Math.LN10; }
// -> function()
x = log10(Math.pow(10, -4))
// -> -3.999999999999999
Math.round(x) == x
// -> false
编辑:我经常看到的一个“解决方案”是选择一些任意的容差,比如ε = 1e-6
,并测试Math.abs(Math.round(x) - x) < ε
. 我认为这样的解决方案会产生比我认为可接受的更多的误报。