2015-01-20 74 views
0

這可能是一個真正合理的答案的問題..但我真的不明白這一點!javascript循環給出了不同的結果

爲什麼,這是否給出不同的結果..

唯一的區別是一個for循環和while循環。即使當他們循環多次準確???

array = [1.2344, 2.47373, 3.444]; 

    var total = 0, 
     total2 = 0, 
     i = array.length, 
     whileLoops = 0, 
     forLoops = 0; 

    while (i--) { 
     whileLoops++; 
     total += array[i]; 
    } 

    for (var i = 0, len = array.length; i < len; i++) { 
     forLoops++; 
     total2 += array[i]; 
    } 

    if (total !== total2) { 
     console.log("BOE") 
    } 

我試過parseFloat,但這也並沒有幫助:(

這是因爲在某種方式???

的Javascript引擎回合數根據要求:小提琴http://jsfiddle.net/5dsx0ump/

UPDATE

請問解決方案是第一個到* 1000和所有的計算後,1000又分爲,以保持輪numbe RS?

+0

你可以給一個小提琴,或告訴我們你得到的輸出? – 2015-01-20 23:08:42

+0

如果使用整數,則會得到相同的結果。顯然問題是四捨五入。 – 2015-01-20 23:10:03

+0

'1.2344 + 2.47373 + 3.444!= 3.444 + 2.47373 + 1.2344' – Fabricator 2015-01-20 23:14:55

回答

0

的差異在環路是您添加的數字的順序。

對於這些添加中的每一個,都會有一個很小的數據丟失,因爲結果必須適合與兩個操作數相同的數據類型。丟失的東西取決於數字是什麼,所以按照不同的順序添加數字會導致最終結果的細微差異。

如果您打印出數字,它們可能看起來也可能不一樣,但打印時看起來相同並不意味着它們必須具有相同的值。這些數字的精度爲15-17位數字,但打印時略小一些,只是爲了避免看到精度限制。

這是浮點數的正常行爲,並且在使用浮點數的任何編程語言中都會看到相同的結果。浮點數不是精確的,因此在應用中數字實際上必須是精確的(例如,銀行業務),所以使用其他數據類型。

+0

謝謝,但仍然..我覺得很奇怪,一個簡單的計算,因爲相互添加數字,給出了不同的結果...如果我將一個可以存儲10000個浮點數的數字除以另一個浮點數爲10000的浮點數,那麼我可以理解它必須「適合」所有點......這只是一個「正常」逗號?? – DutchKevv 2015-01-20 23:22:33

+0

@DutchKev:是的,幾乎所有在逗號後面都有數字的數字都是正常的。一些數字可以精確地表示,例如'0.5'和'0.25',但它們相對較少。如果您看看數組中的數字在浮點表示中的含義,很可能它們都不能完全表示。你可以得到最接近的可能的表示,因此你從一開始就有一個小小的差異。 – Guffa 2015-01-20 23:33:43

+0

例如,哪些數據類型用於銀行業務? – 1252748 2015-01-21 01:01:25

0

浮點數學(使用JavaScript或任何其他語言)有一些你不會期待的怪癖。在你的代碼的最後把這個:

console.log(total, total2); 

返回如下:

7.1521300000000005 7.15213 

哎呀,只是把0.1 + 0.2的瀏覽器控制檯,看看你會得到什麼。不是你所期望的。

而不是重新散列整個的解釋,有一個非常好的寫了和這裏的討論:Is floating point math broken?

+2

不,Javascript浮點數學並不奇怪。這與使用浮點數的其他語言完全相同。 – Guffa 2015-01-20 23:18:08

+0

看看這個:http://yuiblog.com/blog/2009/03/10/when-you-cant-count-on-your-numbers/ – imnancysun 2015-01-20 23:18:26

+0

@imnancysun謝謝,這清除了我:) – DutchKevv 2015-01-20 23:24:06

相關問題