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
    

      

  • 相关阅读:
    EYES组——软件体系结构上机规划
    淘宝软件架构分析分工
    淘宝网系统架构分析以及数据库架构简介
    关于编译器与解释器的区别
    Web前端之高斯模糊图片记
    解决JS浮点数(小数)计算加减乘除的BUG
    JS滚轮事件(mousewheel/DOMMouseScroll)了解
    阻止事件冒泡
    记一次编码相关问题
    细说Form(表单)
  • 原文地址:https://www.cnblogs.com/frostbelt/p/3544904.html
Copyright © 2011-2022 走看看