摘要:原因至于問題產生的原因,或者關于問題的更詳細的描述,大家請看下面幾個文章浮點運算浮點值運算舍入誤差基礎浮點數四則運算精度丟失問題解決方案這里主要討論一下解決方案的問題,上面幾篇文章的解決思路,都是重寫加法減法乘法和除法運算。
問題背景
在 chrome 瀏覽器中調出開發者工具,在控制臺窗口輸入下面的表達式:
0.1 + 0.2 // 期望:0.3,結果:0.30000000000000004
這就是 JavaScript 臭名昭著的浮點值運算舍入誤差問題。
原因至于問題產生的原因,或者關于問題的更詳細的描述,大家請看下面幾個文章:
JavaScript浮點運算0.2+0.1 !== 0.3
javascript浮點值運算舍入誤差
【JS 基礎】JS 浮點數四則運算精度丟失問題 (3)
解決方案這里主要討論一下解決方案的問題,上面幾篇文章的解決思路,都是重寫:加法、減法、乘法和除法運算。感覺過于啰嗦,方案不簡潔。簡單的辦法就是,加、減、乘、除,該怎么算還怎么算。因為結果有問題,所以就在結果上做文章。解決問題的思路,其實就是考慮在計算結果上保留幾位小數的問題。
代碼如下:
/** * 小數點后面保留第 n 位 * * @param x 做近似處理的數 * @param n 小數點后第 n 位 * @returns 近似處理后的數 */ function roundFractional(x, n) { return Math.round(x * Math.pow(10, n)) / Math.pow(10, n); }
有了這個函數,那么加、減、乘、除的計算就變成下面的形式了:
roundFractional(0.1 + 0.2, 1); // 結果:0.3 roundFractional(0.1 * 0.2, 2); // 結果:0.02 // 減法和除法依次類推,此處略掉兩行
可以把下面的代碼復制到 chrome 開發者工具的控制臺中,觀察一下運行效果:
function roundFractional(x, n) { return Math.round(x * Math.pow(10, n)) / Math.pow(10, n); } console.log(0.1 + 0.2); console.log(roundFractional(0.1 + 0.2, 1)); console.log(0.1 * 0.2); console.log(roundFractional(0.1 * 0.2, 2));
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92987.html
摘要:說到數據精度缺失的問題,就想起今年夏天剛轉正做的一個項目。但是和用二進制表示的話位數是無法窮盡的。因此我們看到的用二進制表示的某數只是真實的的一個近似數。這是一個挺好用的數據運算工具,它也是為了解決數據精度缺失而產生的。 說到數據精度缺失的問題,就想起今年夏天剛轉正做的一個項目。當時的需求涉及到金額的計算,那時候對js的了解比現在還少,不過當時關于金額計算這塊js函數的封裝是項目里架構...
摘要:基于這個問題運動基礎問題,我想應該也有一部分人沒有認真對待過中浮點數的四則運算出現的問題。解決方案引自解決方案為了解決浮點數運算不準確的問題,在運算前我們把參加運算的數先升級的的次方到整數,等運算完后再降級的的次方。 基于這個問題:javascript運動基礎問題 ,我想應該也有一部分人沒有認真對待過js中浮點數的四則運算出現的問題。 1.問題描述 示例代碼: var x ...
摘要:標準二進制浮點數算法就是一個對實數進行計算機編碼的標準。然后把取出的整數部分按順序排列起來,先取的整數作為二進制小數的高位有效位,后取的整數作為低位有效位。 浮點運算JavaScript 本文主要討論JavaScript的浮點運算,主要包括 JavaScript number基本類型 二進制表示十進制 浮點數的精度 number 數字類型 在JavaScript中,數字只有numb...
摘要:本文通過介紹的二進制存儲標準來理解浮點數運算精度問題,和理解對象的等屬性值是如何取值的,最后介紹了一些常用的浮點數精度運算解決方案。浮點數精度運算解決方案關于浮點數運算精度丟失的問題,不同場景可以有不同的解決方案。 本文由云+社區發表 相信大家在平常的 JavaScript 開發中,都有遇到過浮點數運算精度誤差的問題,比如 console.log(0.1+0.2===0.3)// fa...
摘要:在中存在兩種類型基本類型和引用類型。值得注意的是,基本類型的值的狀態不會被共享。浮點類型和它們的值中的浮點類型遵循標準的定義。布爾類型和它們的值類型表示兩個邏輯量,和。 眾所周知,Java是一門靜態類型的語言,這意味著所有的變量和表達式的類型會在編譯時確定。同時,Java 還是一門強類型的語言,因此變量的值或表達式的結果的類型都會受到限制(比如一個聲明為 String 的變量不的值不可...
閱讀 2788·2023-04-26 01:47
閱讀 3597·2023-04-25 23:45
閱讀 2472·2021-10-13 09:39
閱讀 612·2021-10-09 09:44
閱讀 1799·2021-09-22 15:59
閱讀 2770·2021-09-13 10:33
閱讀 1723·2021-09-03 10:30
閱讀 662·2019-08-30 15:53