繁体   English   中英

JavaScript 整数除法导致浮点数,是否可能出现舍入错误?

[英]JavaScript Integer division resulting in float, is rounding error possible?

我知道像1.005*100 / 100这样的例子在 JavaScript 中会产生稍微不准确的结果 (100.49999999999999),这是浮点设计所固有的。

我的问题是看看我是否可以在不使用字符串操作的情况下生成可靠的十进制舍入例程。

其中x是一个整数, x / 100 (int/int=float) 会产生视觉上的不准确吗? (即..000001..99999 )证明这一点的例子会更可取。

如果答案是肯定的,那么在 JavaScript 中可靠地将小数点向左移动的唯一方法是使用字符串操作(即MDN 的Math.round10 ),并减少所涉及的性能损失。

根据这个测试,整数除以整数没有不准确。

 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!')

好的。 这意味着无需字符串操作即可创建强大的舍入到十进制例程。 :-)

为了精确我的评论,小数部分仅在无限精度下保持不变,这是符合 JS IEEE-754 标准的浮点算法所没有的。

在有限精度下,您可能无法以浮点数精确表示整数(例如,许多整数 > 2^53)。 x除以100您实际上可能会得到一个在数学上不等于x / 100

例如让x = 1.0e23在 IEEE 754 双精度中, x x = 1.0e23入为99999999999999991611392然后x / 100 = 999999999999999916113.92

但是由于这个数字不能用双精度表示,所以它四舍五入为999999999999999868928

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM