2010-06-15 58 views
5

我已經閱讀了大部分關於浮點數的帖子,並且我理解使用IEEE 754的基本問題(僅以二進制存儲數字的性質),某些分數無法表示。我試圖找出以下幾點:如果Python和JavaScript的都使用IEEE 754標準,那爲什麼執行在Python另一個浮點問題

0.1 + 0.1

結果 0.20000000000000001以下(這是可以預期)

凡爲Javascript中(至少在Chrome和Firefox)的答案是0.2

但是執行

0.1 + 0.2

在這兩種語言的結果在 0.30000000000000004

此外,執行 VAR一個= 0.3;在JavaScript和 0.3

打印結果,其中因爲這樣做在Python結果= 0.3 0.29999999999999999

我想了解這種行爲差異的原因。

此外,OS上的許多帖子鏈接到Java的BigDecimal的JavaScript端口,但鏈接已死亡。有人有副本嗎?

回答

6

做在Python結果= 0.3 0.29999999999999999

不太 - 手錶:

>>> a = 0.3 
>>> print a 
0.3 
>>> a 
0.29999999999999999 

正如你看到的,打印荷蘭國際集團a確實顯示0.3 - 因爲默認print輪到6或7個十進制數字,而鍵入一個表達式(這裏a是一個單變量表達式)顯示結果的位數超過了兩倍(因此揭示了浮點的內在限制)。

對於如何顯示數字,Javascript可能會有略微不同的舍入規則,舍入的確切細節足以解釋您觀察到的差異。請注意,例如(在Chrome的JavaScript控制檯上):

> (1 + .1) * 1000000000 
    1100000000 
> (1 + .1) * 100000000000000 
    110000000000000.02 

請參閱?如果您設法看到更多數字,那麼異常(其中不可避免地)也變得可見。

+0

一如既往,一個明確的答案! – 2010-06-15 20:55:00

+0

謝謝!這有助於清除它。 – jeffmax 2010-06-16 01:07:38

+0

我還沒有嘗試過,但JavaScript BigDecimal類的新鏈接是http://stz-ida.de/index.php?option=com_content&view=article&id=18:bigdecimal-unterstuetzung-fuer-javascript&catid=4:軟件&ITEMID = 32 – jeffmax 2010-06-18 17:28:26

0

我想了解這種行爲差異的原因。

  1. 他們是不同的語言。

  2. 它們使用不同的底層包。

  3. 它們有不同的實現。

當你說「Python」 - 你在說什麼實現? C,Jython,IronPython?你比較過每一個嗎?

JavaScript的人似乎處理重複的二進制分數不同於Python人處理重複二進制分數的方式。

有時Javascript會在最後靜靜地抑制錯誤位。有時它不會。

這就是原因。

您有兩者的源代碼。如果你想知道更多,你可以。然而,瞭解源代碼並沒有多大改變。

3

並打印。

它們可能都具有相同的IEEE 754底層表示,但這並不意味着它們被迫以相同的方式打印。當差異足夠小時,Javascript看起來像是將輸出四捨五入。

浮點數的重要部分是二進制數據的結構,而不是它在屏幕上顯示的內容。