我知道像1.005*100 * 100
这样的例子会在JavaScript中产生稍微不准确的结果(100.49999999999999),这是浮点设计所固有的。
我的问题是看看我是否可以在不使用字符串操作的情况下生成可靠的十进制循环程序。
x
是一个整数,x / 100
(int / int = float)会产生视觉上的不准确吗? (即..000001
或..99999
)证明这一点的例子更可取。
如果答案是肯定的,那么在JavaScript中可靠地向左移动小数点的唯一方法是使用字符串操作(即MDN's Math.round10
),并采取适度的性能影响。
答案 0 :(得分:0)
根据这个测试,整数除以整数是没有不准确的。
var multipliers = [10, 100, 1000, 10000, 100000, 1000000]
for(var i = 0; i < 100000; i++) {
multipliers.forEach(function (mul) {
var x = i / mul
if(x != x.toFixed(6))
document.write('found one! ' + i + ' / ' + mul + ' = ' + x + '<br/>')
})
}
document.write('done!')
&#13;
尼斯。这意味着可以在没有字符串操作的情况下创建强大的循环到十进制例程。 : - )
答案 1 :(得分:0)
为了使我的注释更加精确,小数部分仅以无限精度保持相同,这与JS IEEE-754兼容的浮点算法没有相同之处。
在有限精度中,您可能无法精确地表示浮点数(例如,许多整数> 2 ^ 53)。将x
除以100
时,您实际上可能会得到一个数学上不等于x / 100
的数字。
e.g。让x = 1.0e23
在IEEE 754双精度中,x
轮到99999999999999991611392
然后x / 100 = 999999999999999916113.92
但由于这个数字在双精度中无法表示,因此它会转向999999999999999868928