一. 浮點數精度丟失的緣由javascript
1. 計算機的二進制實現和位數限制有些數沒法表示。就像一些無理數不能有限表示,如:圓周率3.1415926...,1.333...等。JS遵循 IEEE 754 規範,採用雙精度存儲(double precision),佔用64bit。如圖:html
s |
eeeeeee eeee |
ffff ffffffff ffffffff ffffffff ffffffff ffffffff |
1 |
11 |
52 |
說明:java
1位用來表示符號位oracle
11位用來表示指數ide
52位表示尾數函數
JS中能精準表示的最大整數是Math.pow(2, 53),十進制 9007199254740992,大於 9007199254740992 就可能丟失精度。學習
詳細瞭解能夠看這篇論文:What Every Computer Scientist Should Know About Floating-Point Arithmetic
spa
二. 浮點數的加減乘除.net
1. 兩個浮點數相乘htm
alert("1024.2 * 1.2 = " + (1024.2 * 0.2));
三. 解決方案
1. 先把浮點數放大倍數到整數,再進行運算,最後將結果縮小倍數。
2. 案例1:解決兩個浮點數相乘丟失精度問題
// 解決兩個浮點數相乘丟失精度問題 // a: 第一個參數 // b: 第二個參數 function sum(a, b){ var weight = 0; var aStr = a.toString(); var bStr = b.toString(); var regex = /^\d+$/; if(!regex.test(aStr)){ weight += aStr.split(".")[1].length; aStr = aStr.replace(".",""); } if(!regex.test(bStr)){ weight += bStr.split(".")[1].length; bStr = bStr.replace(".",""); } return Number(aStr) * Number(bStr) / Math.pow(10, weight); }
四. 知識點
1.Math.floor()方法執行的是向下取整計算,它返回的是小於或等於函數參數,而且與之最接近的整數。
<script type="text/javascript"> document.write(Math.floor(0.60) + "<br />") document.write(Math.floor(0.40) + "<br />") document.write(Math.floor(5) + "<br />") document.write(Math.floor(5.1) + "<br />") document.write(Math.floor(-5.1) + "<br />") document.write(Math.floor(-5.9)) </script>
輸出:
0 0 5 5 -6 -6
五. 學習博文