zoukankan      html  css  js  c++  java
  • 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>

    //上面有bug,不正确,大家还是忽略上面的结论,看下面的吧.... 

    2.小数的小特性

    先问大家几个问题:1 * 0.1等于多少呢?    2*0.1等于多少呢?  那3*0.1等于多少呢?  (此时此刻你是不是想说:坑爹的,你坑我啊!)哈哈,请耐心看下下面的代码:

    <script>
    for(var i=1; i<=10; i++)
    {
        var res = i * 0.1;
        console.log(i + '*0.1=  ' + res);
    }
    
    /*
    
    1*0.1=  0.1 
    2*0.1=  0.2 
    3*0.1=  0.30000000000000004
    4*0.1=  0.4 
    5*0.1=  0.5 
    6*0.1=  0.6000000000000001
    7*0.1=  0.7000000000000001
    8*0.1=  0.8
    9*0.1=  0.9
    10*0.1=  1 
    
    */
    </script>

    你是否惊讶的发现, 3*0.1 竟然是等于0.30000000000000004, 坑啊!!!

    揭秘: 其实,不紧紧是JS, 所有的计算设备都有这样的问题, 因为 根本不存在完全精确的小数,  10/3 =0.33333333333333.....  程序根本存不了这么多小数, 而是有范围的, 这些小数都是模拟出来的, 银行中的程序不是以元为单位的,你看到的100.23元,

    在他的程序后面其实是10023分;

    所以,尽量避免小数的出现,如果出现的话,想办法转成整数处理。以后会研究研究怎样尽可能小的减少精度损失。

    欢迎拍砖,觉得好的请点下推荐~~(之前有些笔误,现在改好了)

  • 相关阅读:
    JVM和HotSpot
    java中的四种引用类型
    垃圾回收与算法
    Full GC
    JVM内存结构
    事务不同的隔离级别实现原理
    事务的隔离级别
    jQuery后续和 前端框架Bootstrap
    jQuery
    BOM和DOM操作
  • 原文地址:https://www.cnblogs.com/Ivangel/p/3683046.html
Copyright © 2011-2022 走看看