为什么JavaScript中的parseFloat()会产生一致但不连续的结果?
Why does parseFloat() in JavaScript produce consisant but unitinutive results?
在回答关于在html input
中添加增加浮点值的方法的问题时,我遇到了我所知道的IEEE浮点数学的常见问题。这是我所看到的一个示例(带有演示):
<input type="text" name="BoqTextBox" id="BoqTextBox" value="0.001" />
<input type="Button" id='AddButton' value="+" />
<script>
$('#AddButton').on('click', function () {
var input = $('#BoqTextBox');
input.val(parseFloat(input.val(), 10) + 1);
})
</script>
点击+
按钮,导致输入开始像这样增加(使用IEEE二进制表示的转换器):
S| Exp | Mantissa
0.001 //0 0111 0101 000 0011 0001 0010 0110 1111
1.001 //0 0111 1111 000 0000 0010 0000 1100 0101
2.001 //0 1000 0000 000 0000 0001 0000 0110 0010
3.001 //0 1000 0000 100 0000 0001 0000 0110 0010
4.0009999999999994 //0 1000 0001 000 0000 0000 1000 0011 0001
5.0009999999999994 //0 1000 0001 010 0000 0000 1000 0011 0001
6.0009999999999994 //0 1000 0001 100 0000 0000 1000 0011 0001
7.0009999999999994 //0 1000 0001 110 0000 0000 1000 0011 0001
8.001 //0 1000 0010 000 0000 0000 0100 0001 1001
9.001 //0 1000 0010 001 0000 0000 0100 0001 1001
10.001 //0 1000 0010 010 0000 0000 0100 0001 1001
... then predictably like this until ...
15.001 //0 1000 0010 111 0000 0000 0100 0001 1001
16.000999999999998 //0 1000 0011 000 0000 0000 0010 0000 1100
17.000999999999998 //0 1000 0011 000 1000 0000 0010 0000 1100
18.000999999999998 //0 1000 0011 001 0000 0000 0010 0000 1100
19.000999999999998 //0 1000 0011 001 1000 0000 0010 0000 1100
... then predictably like this until ...
31.000999999999998 //0 1000 0011 111 1000 0000 0010 00001100
32.001 //0 1000 0100 000 0000 0000 0001 00000110
33.001 //0 1000 0100 000 0100 0000 0001 00000110
... then predictably like that up to 256 (a power of 8 seemed fitting to test) ...
我还不知道的是为什么这种行为在这些特定的值上表现出来,我可以采取什么逻辑步骤来减轻它的影响?舍入显示的目的,同时保持实际计算值存储在其他地方?
正如您所猜测的,您应该只在四舍五入后打印输出。这种行为是由十进制&二进制基数,因为有些十进制数在浮点数的二进制格式中没有精确的表示,因此在将其存储为二进制然后再次读取时,会失去一些精度。浮点数在CPU中的表示形式为1.XXXXX…XXXX * 2^P,所以从这个形式中你可以看到,并不是所有的十进制数都有XXXXXX...XXX
的有限长度的表示。
相关文章:
- 当查询不在displayField中时,引导Ajax Typeahead不显示结果
- Moment.js不显示结果
- Javascript 函数不返回结果
- jquery jqgrid 不显示结果,具体取决于 JSON 对象中的参数
- 不连续滚动-检测用户是否停止滚动
- 自动完成 JQuery 不显示结果
- 显示数学运算语法而不是结果
- 高图表没有点标记,但显示单点或不连续点
- 返回不一致结果的日期(取决于是否存在前导零)
- JavaScript 异步循环不返回结果
- jQuery $.post() 函数难以不显示结果
- 为什么 document.write 不显示结果
- 主干.js如何处理不返回结果的 GET 请求
- 按活动排序,但不在结果中显示活动
- JavaScript 变量范围不期望结果
- 三.js - 如何使用缓冲区几何绘制不连续线
- 主干提取不返回结果
- JSON 不显示结果
- JavaScript:在不影响结果准确性的情况下舍入数字
- 为什么JavaScript中的parseFloat()会产生一致但不连续的结果?