2013-03-22 86 views
2

雖然提供了一個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) ... 

我還不知道爲什麼這種行爲表現在這些特定的價值觀上,我可以採取什麼邏輯步驟來緩解其影響?四捨五入顯示目的,同時保持實際計算的值存儲在其他地方?

+0

我會一輪顯示 – 2013-03-22 20:02:04

+0

@JanDvorak我敢肯定,有沒有其他的解決方案... – 2013-03-22 20:05:45

+0

@JuanMendes'BigDecimal' – 2013-03-22 20:06:52

回答

3

正如你猜你應該打印輸出後四捨五入他們。該行爲是二進制基數之間的差值的結果,因爲有十進制數字,它們不具有二進制格式的浮點數的精確表示形式,因此在將其存儲到二進制文件然後再次讀取時會丟失一些準確性。浮點數在CPU中以1.XXXXX ... XXXX * 2^P的形式表示,因此從此表單中可以看到,並非所有的十進制數字都具有限制長度爲XXXXXX...XXX的表示形式。

+0

我完全和你一樣在這個頁面上,也許我正在尋找的是更深入的看看爲什麼數字在這一點上突破,然後重新加入(也許我需要查看一下尾數是多少) – 2013-03-22 20:16:41

+0

尾數是我在'1.XXXXXX ... XXXX'上注意到的部分。您可以在http://kipirvine.com/asm/workbook/floating_tut.htm閱讀更多內容 – aram90 2013-03-22 20:18:18

相關問題