js 的数值限制可能引起的问题
2014-02-11 18:34
169 查看
源于: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
相关文章推荐
- 浅谈js 闭包引起的内存泄露问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- JS中解决数值很小时四舍五入的精度问题
- 关于IE8下调试JS的问题--“无法附加进程,进程可能附加了另一个调试程序”
- JS限制条件补全问题实例分析
- 用JS限制文本框只能输入数字时的正则表达式问题!
- js限制页面复制,一次纠结的问题查找
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- js 下拉框change事件变化所引起的问题
- 提交按钮的name='submit'引起的js失效问题及原因
- 戏说js的call, apply 和 bind (文章内容可能引起逻辑严谨的程序员的不适,慎入!)
- JS 分号引起的一段调试问题
- 一个页面使用两次timepicker.js引起的Maximum call stack size exceeded问题解决办法及bug修复
- 关于引入两个jquery.js文件引起$符号命名冲突的问题
- 再次谈论React.js实现原生js拖拽效果引起的一系列问题
- sql语句中的字段类型与sql表字段类型不一致可能引起的性能问题
- js 中对数值的格式化问题
- /MT、/MD编译选项,以及可能引起在不同堆中申请、释放内存的问题
- 一个用js限制用户输入字节个数的问题.