javascript中可處理的浮點數的最高精度(和小數的一些小特性)


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分;

所以,儘量避免小數的出現,如果出現的話,想辦法轉成整數處理。以後會研究研究怎樣儘可能小的減少精度損失。

 

歡迎拍磚,覺得好的請點下推薦~~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章