[我知道1.005*100 / 100
之类的示例在JavaScript中产生的结果有点不准确(100.49999999999999),这是浮点设计所固有的。
我的问题是看是否可以在不使用字符串操作的情况下产生可靠的十进制舍入例程。
x
是整数,x / 100
(int / int = float)会不会产生视觉误差? (即..000001
或..99999
)证明这一点的示例将更可取。
如果答案为是,那么可靠地将小数点向JavaScript中的左侧移动的唯一方法是使用字符串操作(即MDN's Math.round10
),并采取适当的性能打击措施。
根据此测试,整数除以整数没有错误。
Math.round10
不错。这意味着无需字符串即可创建健壮的舍入到十进制例程。 :-)
为精确起见,小数部分仅在无限精度上保持相同,而与JS IEEE-754兼容的浮点算法则没有。
以有限的精度,您可能无法精确地以浮点数表示整数(例如,许多整数> 2 ^ 53)。用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!')
除以x
时,实际上可以得到一个数学上不等于100
的数字。
例如让x / 100
在IEEE 754双精度中,x = 1.0e23
舍入为x
然后99999999999999991611392
但是由于该数字不能以双精度表示,因此四舍五入为x / 100 = 999999999999999916113.92