雖然提供了一個answer to a question關於添加一個方法,增加一個HTML值的浮動值在input
,我遇到了我所知道的是common issue with IEEE Floating point math。這是我所看到的例子(用demo):爲什麼JavaScript中的parseFloat()會產生consisant但會產生單元結果?
<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) ...
我還不知道爲什麼這種行爲表現在這些特定的價值觀上,我可以採取什麼邏輯步驟來緩解其影響?四捨五入顯示目的,同時保持實際計算的值存儲在其他地方?
我會一輪顯示 – 2013-03-22 20:02:04
@JanDvorak我敢肯定,有沒有其他的解決方案... – 2013-03-22 20:05:45
@JuanMendes'BigDecimal' – 2013-03-22 20:06:52