摘要:但由于十進制小數并不總能用二進制小數精確表示,在進行小數運算時,經常會出現莫明其妙的誤差,比如之類的。它唯一能解決的問題就是避免十進制小數和二進制小數之間的轉換誤差它不能提高運算的精度有效數字,也不能擴大數字的表示范圍。
以前的舊文,貌似還是挺有用的,在這里記一下避免丟失:
基于Web的應用程序,經常需要在頁面中作些簡單的計算,用作數據提交前的驗證,或者給用戶提供更友好的信息。但由于十進制小數并不總能用二進制小數精確表示,在進行小數運算時,經常會出現“莫明其妙”的誤差,比如“33*2.46=81.179999999999999”之類的。如果要在頁面上顯示計算結果,特別是當這個結果表示金額的時候,誤差通常是不可容忍的。
網上有人說Javasript不能做精確運算,所以會出現誤差云云。這當然是不對的,這種情況應該是由計算機二進制表示的本質決定的。應該說,Javascript的表現其實還好一些,因為在數字進行運算之前,我們總是可以得到它的精確表示(字符串)。
解決問題的基本思路就是犧牲速度換精度,逐位進行運算,并且自己在程序邏輯中實現進位。為此,Java提供了BigDecimal類。而在Javascript中,我們就沒這么幸運了,沒有現成的類庫可供使用。可能是制訂規范的人也認為沒必要使用JS來做“科學計算”吧。
我以前做的項目中,經常會碰到計算金額總價、合計、總計之類的“商業計算”,對精確小數運算的需求還是比較迫切的,所以自己開發了一個小數運算的“類”。實現這個類的時候,使用了投機取巧的辦法:把小數轉換為整數,運算完成后,再轉換回去。它唯一能解決的問題就是:避免十進制小數和二進制小數之間的轉換誤差;它不能提高運算的精度(有效數字),也不能擴大數字的表示范圍。
使用方法如下:
//使用數字的literal表示,創建一個Decimal對象 var d1 = new Decimal(3.68); //調用該對象的四則運算方法,得到一個新的Decimal對象 var res=d1.add(2.25); //調用該對象的valueOf方法,得到數值 alert( res.valueOf() ); //顯示 5.93 //或者調用該對象的toString方法,得到數值的字符串表示 alert( res.toString() ); //顯示 5.93 //可用的運算方法對應四則運算的+、-、×、÷ var d1 = new Decimal(3.68); var res=d1.add(2.25); assertEquals("3.68+2.25", "5.93", res.toString()); var d1 = new Decimal(3.68); var res=d1.minus(2.25); assertEquals("3.68-2.25", "1.43", res.toString()); var d1 = new Decimal(2.22); var res=d1.multiply(3.33); assertEquals("2.22*3.33", 7.3926, res.valueOf()); var d1 = new Decimal(6.66); var res=d1.divide(2.22); assertEquals("6.66/2.22", 3, res.valueOf());
源碼在這里下載:https://pan.baidu.com/s/1i4Gugqp
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81665.html
摘要:使用,保證精度的同時,能精準的進行四舍六入計算。類精確的數學運算使用來實現精準度因為精度的原因構造方法的結果有一定的不可預知性,例如因此建議使用。算法規則四舍六入五考慮,五后非零就進一,五后皆零看奇偶,五前為偶應舍去,五前為奇要進一。 四舍六入計算 算法規則: 四舍六入五考慮, 五后非零就進一, 五后皆零看奇偶, 五前為偶應舍去, 五前為奇要進一。 使用BigDecimal,保證精度的...
摘要:也就是說不僅是會產生這種問題,只要是采用的浮點數編碼方式來表示浮點數時,則會產生這類問題。到這里我們都理解只要采取的浮點數編碼的語言均會出現上述問題,只是它們的標準類庫已經為我們提供了解決方案而已。 Brief 一天有個朋友問我JS中計算0.7 * 180怎么會等于125.99999999998,坑也太多了吧!那時我猜測是二進制表示數值時發生round-off error所導致,但并不...
摘要:上一篇學習下一代語法一,我們學習了關于塊作用域變量或常量聲明和語法新的字符串拼接語法模版字面量數組元素或對象元素的解構賦值和對象字面量簡寫的相關知識。這便是擴展運算符的用途之一。 本文同步 帶你入門 JavaScript ES6 (二),轉載請注明出處。 上一篇學習下一代 JavaScript 語法: ES6 (一),我們學習了關于塊作用域變量或常量聲明 let 和 const 語法、...
摘要:由于浮點數不是精確的值,所以涉及小數的比較和運算要特別小心。根據標準,位浮點數的指數部分的長度是個二進制位,意味著指數部分的最大值是的次方減。也就是說,位浮點數的指數部分的值最大為。 一 前言 這篇文章主要解決以下三個問題: 問題1:浮點數計算精確度的問題 0.1 + 0.2; //0.30000000000000004 0.1 + 0.2 === 0.3; // ...
摘要:本文通過介紹的二進制存儲標準來理解浮點數運算精度問題,和理解對象的等屬性值是如何取值的,最后介紹了一些常用的浮點數精度運算解決方案。浮點數精度運算解決方案關于浮點數運算精度丟失的問題,不同場景可以有不同的解決方案。 本文由云+社區發表 相信大家在平常的 JavaScript 開發中,都有遇到過浮點數運算精度誤差的問題,比如 console.log(0.1+0.2===0.3)// fa...
閱讀 3686·2021-09-07 10:19
閱讀 3627·2021-09-03 10:42
閱讀 3584·2021-09-03 10:28
閱讀 2548·2019-08-29 14:11
閱讀 809·2019-08-29 13:54
閱讀 1594·2019-08-29 12:14
閱讀 417·2019-08-26 12:12
閱讀 3614·2019-08-26 10:45