1.之前在度娘那找了一下關於javascript中可處理的浮點數的最高精度的問題,但找了好久也找不到,於是自己 小小的研究了一下,之前以爲是17,後來測到18,再後來又測到19,經過一系列的改寫,得到下面的相對完善的檢測方案:
<script> //返回數字數組中的最大值 function arrMax(arr) { return Math.max.apply({}, arr); } //10萬個隨機小數中的最大精度 function maxDec() { var arr = []; var dec = 0; var len = 0; var num = 0; //取得10萬個隨機小數的小數位精度,如果直接100萬個會報錯,瀏覽器不給循環這麼多次,所以就來個10萬次 for(var i=0; i<100000; i++) { dec = Math.random(); //隨機小數 len = dec.toString().split('.')[1].length; //獲取上面得到的隨機小數的小數位長度 arr.push(len); //用數組把這個長度存起來 } //返回這10萬個中最大的 return arrMax(arr); } //上面的10萬個有點少,再來個100循環,就是1千萬了 var temp = []; for(var i=0; i<100; i++) { temp.push(maxDec()) } alert(arrMax(temp)) //多執行幾次,最大的不超過22,所以JS可以處理的小數最高精度爲22 位;如果您測到比22大的,一定要告訴下我啊~~~ </script>
2.小數的小特性
先問大家幾個問題:1 * 0.01等於多少呢? 2*0.01等於多少呢? 那3*0.01等於多少呢? (此時此刻你是不是想說:坑爹的,你坑我啊!)哈哈,請耐心看下下面的代碼:
<script> for(var i=1; i<=10; i++) { var res = i * 0.1; console.log(i + '*0.01= ' + res); } /* 1*0.01= 0.1 2*0.01= 0.2 3*0.01= 0.30000000000000004 4*0.01= 0.4 5*0.01= 0.5 6*0.01= 0.6000000000000001 7*0.01= 0.7000000000000001 8*0.01= 0.8 9*0.01= 0.9 10*0.01= 1 */ </script>
你是否驚訝的發現, 3*0.01 竟然是等於0.30000000000000004, 坑啊!!!
揭祕: 其實,不緊緊是JS, 所有的計算設備都有這樣的問題, 因爲 根本不存在完全精確的小數, 10/3 =0.33333333333333..... 程序根本存不了這麼多小數, 而是有範圍的, 這些小數都是模擬出來的, 銀行中的程序不是以元爲單位的,你看到的100.23元,
在他的程序後面其實是10023分;
所以,儘量避免小數的出現,如果出現的話,想辦法轉成整數處理。以後會研究研究怎樣儘可能小的減少精度損失。
歡迎拍磚,覺得好的請點下推薦~~