導航:首頁 > 解決方法 > js中小數運算不精準的解決方法

js中小數運算不精準的解決方法

發布時間:2022-08-08 08:56:48

① 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

閱讀全文

與js中小數運算不精準的解決方法相關的資料

熱點內容
去污漬小妙招最好的方法技巧 瀏覽:77
橋式電路測量方法優缺點在哪 瀏覽:19
用優盤裝電腦方法 瀏覽:78
高空作業安全繩安裝方法 瀏覽:757
利民am4安裝方法 瀏覽:66
體溫測量方法外語版視頻 瀏覽:426
被套口在左邊的簡便方法視頻 瀏覽:481
常用的實驗室室內質控方法 瀏覽:586
如何治療男性尿不盡最快的方法 瀏覽:898
sfc分析方法應用領域 瀏覽:782
馬油加九朵雲使用方法 瀏覽:162
大米摻偽鑒別的方法 瀏覽:14
綠豆腐的製作方法視頻 瀏覽:453
什麼除腳臭最好的方法 瀏覽:648
快速滅蒼蠅的方法 瀏覽:142
種植貴族菜方法 瀏覽:205
保險盒的連接方法 瀏覽:171
常用除氯方法 瀏覽:3
電阻類型使用方法 瀏覽:998
如何在家製作油條最簡單的方法 瀏覽:442