gpt4 book ai didi

javascript - 为什么 JavaScript 中的 parseFloat() 会产生一致但单一的结果?

转载 作者:行者123 更新时间:2023-11-29 19:58:07 24 4
gpt4 key购买 nike

同时提供 answer to a question关于在 html input 中添加一个增加浮点值的方法,我遇到了我所知道的 common issue with IEEE Floating point math .这是我所看到的示例(带有 demo ):

<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>

点击 + 按钮,使输入首先像这样递增(使用 converter 用于 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) ...

我还不知道为什么这种行为会在这些特定值上表现出来,我可以采取哪些合乎逻辑的步骤来减轻其影响?为显示目的四舍五入,同时将实际计算值存储在其他地方?

最佳答案

如您所料,您应该仅在四舍五入后才打印输出。这种行为是十进制和二进制基数之间差异的结果,因为有些十进制数在 float 的二进制格式中没有精确表示,因此在将其存储为二进制然后再次读取时会失去一些准确性. float 在 CPU 中以 1.XXXXX...XXXX * 2^P 的形式表示,所以从这个形式你可以看出并不是所有的十进制数都有这样的表示形式 XXXXXX...XXX.

关于javascript - 为什么 JavaScript 中的 parseFloat() 会产生一致但单一的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15578841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com