2013-10-16 27 views
2

我有一個簡單的區間,每次減去0.1。但數列後3次迭代去怪異...這就是我:Javascript減去給出的意外值

function transition_opacity(div_id,opacity){ 
    opacity = 1; //temporary test 
    var IntervId = setInterval(process_transition,30); 

    function process_transition(){ 
     console.log(opacity); //check the value 
     opacity = opacity - 0.1 
     div_id.style.opacity = opacity; 
    if(opacity < 0.0){ 
      rmv_div(div_id); 
      clear(); 
     } 
    } 

    function clear(){ 
     clearInterval(IntervId); 
    } 
} 

控制檯日誌顯示本作的opacity值:

1 
0.9 
0.8 
0.7000000000000001 
0.6000000000000001 
0.5000000000000001 
0.40000000000000013 
0.30000000000000016 
0.20000000000000015 
0.10000000000000014 
1.3877787807814457e-16 

爲什麼做這個瘋狂的數字序列= /對我來說似乎沒什麼意義......它可以正常工作到0.8

+0

哦,浮動數字,你混蛋。也許這將有助於:http://floating-point-gui.de/ – acdcjunior

+0

重複例如http://stackoverflow.com/questions/963873/1-265-10000-126499-99999999999 –

回答

1

對於某些不能完美表示浮點數的浮點數的精確表示方式,浮點存儲其數字的方式。你所看到的只是實際價值上的細微差別。

這通常可以通過將您的值舍入到一定的小數位數來解決。您可以通過針對該主題的簡單Google搜索儘可能多地閱讀浮點精度。經典的解決方法是將您的值舍入到一定數量的小數點。

但是,你的函數實際上仍然可以正常工作,因爲你只是在尋找< 0,它仍然會給你適當的迭代次數,即使有小的數值差異。

你實際上並不需要這個功能的正常工作,但如果你想確切值,你可以圓到小數點後一位這樣的:

function transition_opacity(div_id,opacity){ 
    var opacity = 1; //temporary test 
    var IntervId = setInterval(process_transition, 30); 

    function process_transition(){ 
     console.log(opacity); //check the value 
     opacity = Math.round((opacity - 0.1) * 100)/100; 
     div_id.style.opacity = opacity; 
     if (opacity < 0) { 
      rmv_div(div_id); 
      clear(); 
     } 
    } 

    function clear(){ 
     clearInterval(IntervId); 
    } 
} 

僅供參考,我也宣告opacity是一個局部變量。

+0

我認爲,但在我的JSFiddle檢查「<0」仍然似乎不工作:http://jsfiddle.net/ 4kWCB/12/ – Sir

+0

@Dave - 在此處使用我的代碼:http://jsfiddle.net/jfriend00/8Yc7k/。我會研究爲什麼它不適合你的。 – jfriend00

+0

@Dave - 你不工作,因爲div_id是一個字符串,而不是一個DOM元素,因此'process_transition()'函數在檢查不透明度之前會引發異常,並且每次都會中止。在我的jsFiddle中查看我是如何將div_id轉換爲DOM元素的,或者是您的代碼與此問題修復:http://jsfiddle.net/jfriend00/mM7wQ/。請記住檢查您的瀏覽器錯誤控制檯,因爲它會經常告訴您在這種情況下出現了什麼問題。 – jfriend00

0

這是因爲表示浮動數字的方式。計算機將盡可能準確地給出值0.7。但是,因爲它沒有使用基數10,所以它可以接近0.7的最準確的值將是0.7000000000000001。當你減去另一個0.1時,同樣的事情發生,依此類推。

0

對於這類問題,Javascript浮點是已知的;這是由於(我在此引用the good book),「[Javascript]已採用IEEE標準的二進制浮點運算(IEEE 1754)」。

推薦的解決方案是以整數值工作 - 對於您的場景,將不透明度值乘以100,進行計算,然後除以100以將該值轉換回十進制值是合理的。