① js 中Math.round()精度問題急
不是BUG,最簡單的alert(0.56*100);。JavaScript小數在做四則運算時,精度會丟失。
具體可參考IEEE
754的浮點計數法
② js四捨五入問題 不準確
你的這個問題貌似連續問了好幾天,也問了好幾個了,難道一直都沒有解決的嗎?
如果你一直都沒有理解的話,那麼我來給你仔細地講一講。
首先我們來看一段JS代碼:
vara=500.50;
varb=6.97;
varresult=a*b;
alert(result);
那麼,我們alert之後的結果是:
3488.4849999999997
為什麼這樣?
網上有網友說,這是JavaScript的浮點數運算BUG,其實,並不能算是BUG,而是由於浮點數計算精度造成的誤差;
這樣一來,你所說的結果為3488.485,對於JavaScript來說,就不準確了。
然後我們再來看下面的代碼:
vara=500.50;
varb=6.97;
varc=a*b;//這里的a*b其實是3488.4849999999997
varresult=Math.round(c*100)/100;//那麼它乘以100之後是348848.49999999997
//然後,取整後是348848,除100後是3488.48
alert(result);//結果自然就是3488.48
輸出:
3488.48
好的,到這里相信你已經知道它產生的原因了,如果你想更細化地知道它為什麼會出現那麼多的小數位,可以看這篇文章的相關介紹:
【float浮點數的二進制存儲方式及轉換】http://blog.csdn.net/zcczcw/article/details/7362473
那麼接下來,看看如何解決這個問題:
我們知道,問題是出在了二進制數據計算和保存的過程之中,那麼,我們就要在它進行計算和保存之前,對其進行處理,
如何處理呢?我們已經知道最初參與計算的兩位浮點數都是兩位小數,同時我們還需要以兩位小數後面的一位小數來決定是否四捨五入,這樣,我們將其中一個浮點數的小數點後移3位,這樣能夠讓我們獲取到的結果保持在我們需要的小數位後3位都在整數部分,也就不存在浮點數BUG的問題了:
vara=500.50*1000;//讓其中一個參與運算的浮點數小數點後移3位
varb=6.97;
varc=a*b/1000;//計算完成後,再前移三位
alert(c);//我們得到的中間值結果准確!
varresult=Math.round(c*100)/100;//再參與四捨五入計算
alert(result);//結果准確
輸出結果 :
3488.49
另外,像這樣在JavaScript下計算浮點數的過程由於經常會出現這種不可控的現象,所以,聰明的程序工程師們寫了很多規避這種不可控現象的函數,下面就給你提供一些這方面的資料:
【js浮點數精確計算函數(加,減,乘,除)】http://www.cnblogs.com/konooo/archive/2010/01/23/1654617.html
【JS浮點數運算Bug的解決辦法】 http://hi..com/bing2liuliu/item/6b201a48ea51c40b6dc2f0b6
——————
最後我想說的是,我這幾天混跡於網路知道,至少看你問過這個問題四遍了,也就是說,這個問題是我看到的你的第四個相同的問題。
而你在其它幾個問題里,並不是沒有得到答案,而那幾個問題回答的答案也相對比較明確了。
你所要求的:「不要什麼公式」、「簡單的」等要求,是有的,粘貼復制就可以了,把他們提供的方法粘貼到你的代碼上,調用就可以了。
但這樣好像還無法滿足你,讓我們這些為此兢兢業業,試圖解決各種有挑戰性問題的網友和程序員們情何以堪吶!
我真想寫幾K的文檔,就建完了一個站,但它不現實不是....
③ js為什麼不能正確處理小數運算
js 不能正確處理小數運算,包括其它高級編程語言一樣,這不是語言本身的設計錯誤,而是計算機內部本身就不能正確處理小數的運算,對小數的運算往往會得到意想不到的結果,因為並不是所有的十進制小數能被二進製表示。建議看看計算機組成原理的書
④ 為何js計算帶有小數的加法的時候會出現誤差
很正常的,浮點數運算的誤差。哪種語言都這樣,只是誤差大小不同而已。
用解析字元串的方式移動小數點,轉化為整數,完畢後,在把小數點復位。
浮點數運算的時候,先轉化為二進制,用二進制來算,結果再轉回十進制
例如 :求1038.1-1000
1038.1=10000001110......
1000= 1111101000
1038.1轉化為二進制是個無限循環小數,1100是循環節,只能取近似值,誤差就是這里產生的
如果瀏覽器版本高,可以用toFixed() 方法可把 Number 四捨五入為指定小數位數的數字.
後有固定的 num 位數字。如果必要,該數字會被舍入,也可以用 0 補足,以便它達到指定的長度。如果 num 大於 le+21,則該方法只調用 NumberObject.toString(),返回採用指數計數法表示的字元串。
語法
NumberObject.toFixed(num)
返回值
返回 NumberObject 的字元串表示,不採用指數計數法,小數點後有固定的 num 位數字。如果必要,該數字會被舍入,也可以用 0 補足,以便它達到指定的長度。如果 num 大於 le+21,則該方法只調用 NumberObject.toString(),返回採用指數計數法表示的字元串。
拋出
當 num 太小或太大時拋出異常 RangeError。0 ~ 20 之間的值不會引發該異常。有些實現支持更大范圍或更小范圍內的值。
當調用該方法的對象不是 Number 時拋出 TypeError 異常。
在本例中,我們將把數字舍入為僅有一位小數的數字:
Show the number 13.37 with one decimal:
<script type="text/javascript">
var num = new Number(13.37);
document.write (num.toFixed(1))
</script>
輸出:
Show the number 13.37 with one decimal:
13.4