zoukankan      html  css  js  c++  java
  • js 的数值限制可能引起的问题

    源于:https://raw.github.com/ruanyf/jstutorial/gh-pages/grammar/number.md
    
    1. 根据国际标准IEEE 754,64位浮点数格式的64个二进制位中,第0位到第51位储存有效数字部分,第52到第62位储存指数部分,第63位是符号位,0表示正数,1表示负数。因此,JavaScript提供的有效数字的精度为53个二进制位(IEEE 754规定有效数字第一位默认为1,再加上后面的52位),也就是说,绝对值小于2的53次方的整数都可以精确表示。
    
    问题:
    (出自:http://javascript-puzzlers.herokuapp.com/)
    var END = Math.pow(2, 53);
    var START = END - 100;
    var count = 0;
    for (var i = START; i <= END; i++) {
        count++;
    }
    console.log(count);
    
    it goes into an infinite loop, 2^53 is the highest possible number in javascript, and 2^53+1 gives 2^53, so i can never become larger than that.
    
    解释:
    2^53+1 = 2^53, 死循环
    大于2^53的整数计算不能确保正确,但不一定总不正确
    
    但 2^53+2 = 2^53 + 2
    var END = Math.pow(2, 53);
    var START = END - 100;
    var count = 0;
    for (var i = START; i <= END; i += 2) {
        count++;
    }
    console.log(count);
    
    输出51
    
    2. JavaScript的数值有多种表示方法,可以用字面形式直接表示,也可以采用科学计数法表示,下面是两个科学计数法的例子。
        以下两种情况,JavaScript会自动将数值转为科学计数法表示,其他情况都采用字面形式直接表示。
        (1)小数点前的数字多于21位。
            1234567890123456789012
            // 1.2345678901234568e+21
    
            123456789012345678901
            // 123456789012345680000
        (2)小数点后的零多于5个。
            0.0000003 // 3e-7
            0.000003 // 0.000003
    
    问题:
    parseInt(1111111111111111, 10)              /^d+$/.test(1111111111111111)
    1111111111111111                            true
    parseInt(111111111111111111, 10)            /^d+$/.test(111111111111111111)
    111111111111111100                          true
    parseInt(1111111111111111111111, 10)        /^d+$/.test(1111111111111111111111)
    1                                           false
    
    解释:
    '1111111111111111111111'.length : 22
    1111111111111111111111 自动转化为 1.1111111111111111e+21
    parseInt(1.1111111111111111e+21, 10) -> 1
    /^d+$/.test(1.1111111111111111e+21) -> false
    

      

  • 相关阅读:
    学习&分享
    跳槽
    20121113:延期通知书
    2012.9.9 baocheng博客园正式与大家见面啦!
    数据库
    ASP.Net模板引擎
    javascript图片切换效果
    dockercompose环境下zookeeper单机搭建、集群搭建
    Linux服务器日常巡检脚本
    MMOS FFB伺服直驱方向盘主控板DIY
  • 原文地址:https://www.cnblogs.com/frostbelt/p/3544904.html
Copyright © 2011-2022 走看看