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
js 的数值限制可能引起的问题的更多相关文章
- js对数值型数组排序错误
今天对一个js的数值数组排序,结果发现好像排后的像是对字符数组排的序,后来一查才发现 a = [33,1000]; a.sort(); 结果:1000 33 无论类型,sort方法会调用每个数组项的t ...
- js处理数值和日期本地化
js处理数值和日期本地化 const s = new Intl.NumberFormat('zh-cn'); s.format(111.111) // "111.111" cons ...
- JS中数值类型的本质
一.JS中的数值类型 众所JS爱好友周知,JS中只有一个总的数值类型--number,它包含了整型.浮点型等数值类型.其中,浮点数的实现思想有点复杂,它把一个数拆成两部分来存储.第一部分是有效位数,也 ...
- JS写法 数值与字符串的相互转换 取字符中的一部分显示 正则表达规则
http://www.imooc.com/article/15885 正则表达规则 <script type="text/javascript"> </scrip ...
- js 各种数值类型正则匹配检测
随拿随用只js正则表达式,反正平时工作我是不写正则的,大神请自动绕行: 验证数字的正则表达式集验证数字:^[0-9]*$验证n位的数字:^\d{n}$验证至少n位数字:^\d{n,}$验证m-n位的数 ...
- 代码: js: 数值操作
数值转换: 将 32000 这样的数字,转换为“3.2万” //将32000 这样的数字,转换为 “3.2万” var price = parseInt('31999'); var price2 = ...
- js计算数值
1.丢弃小数部分,保留整数部分 parseInt(5/2) 2.向上取整,有小数就整数部分加1 Math.ceil(5/2) 3,四舍五入. Math.round(5/2) 4,向下取整 Math.f ...
- JS 将数值取整为10的倍数
问题描述: 将数值处理为 10 的倍数,并支持向上或者向下取整 如将 2345 可以处理为 2300 | 2400 | 3000 | 2000 解决方案: /** * 将数字取整为10的倍数 * @p ...
- js非数值的比较
/** * 非数值的比较: * 1.对于非数值的比较时,会将其转换成数字然后再比较 * 2.如果符号两端是字符串的值进行比较时,不会将其转换为数字进行比较,而是 * 分别比较字符串中的字符的 unic ...
随机推荐
- Python 爬虫实例(15) 爬取 百度百聘(微信公众号)
今天闲的无聊,爬取了一个网站,百度百聘,仅供学习参考 直接上代码: #-*-coding:utf-8-*- from common.contest import * def spider(): hea ...
- Xtrabackup备份、还原、恢复Mysql操作大全
环境:CentOS 6.7 + Mysql 5.7.19 + Xtraback 2.4.8 innobackupex常用参数: --user=USER 指定备份用户,不指定的话为当前系统用户 --p ...
- 一种解决新版本API完全兼容老版本API的方法
原文:http://android.eoe.cn/topic/android_sdk 这节课程我们讨论如何创建一个实现类,即能对应新版本的API,又能够保持对老版本API的支持. * 寻找一个替代的解 ...
- GDC2017资料整理
GDC2017的资料最近放出来了,我筛选了一下 特别是Horizon放出很多干货,也有一些去年的末班车.Vulkan有一堆,但不是很感兴趣 感谢王同学的搬运和分类(包含以下链接pdf和视频): htt ...
- remoting生命周期
https://www.cnblogs.com/luomingui/archive/2011/07/09/2101779.html
- 【Android】2.0 第2章 初识Android App
分类:C#.Android.VS2015: 创建日期:2016-02-04 一.认识Android操作系统 Android最早由安迪•罗宾(Andy Rubin)创办,2007年被Google公司收 ...
- 深度学习领域的Papers
https://github.com/songrotek/Deep-Learning-Papers-Reading-Roadmap 深度学习论文阅读路线图 Deep Learning Papers R ...
- react-scripts的css modules
用create-react-app创建的项目基于react-scripts内建支持css modules,需要把css文件名改成filename.module.css,导入方式需要改成: import ...
- oracle 负载均衡连接方式常用SQL语句备忘录
1.---表中有重复记录用SQL语句查询出来 select * from Recharge where RechargeSerial in (select RechargeSerial from Re ...
- (原创)用c++11打造好用的variant
variant类似于union,它能代表定义的多种类型,允许将不同类型的值赋给它.它的具体类型是在初始化赋值时确定.boost中的variant的基本用法: typedef variant<in ...