美文网首页
JS数值精度

JS数值精度

作者: littleyu | 来源:发表于2020-04-20 16:59 被阅读0次
整数和浮点数

JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,11.0是相同的,是同一个数。

1 === 1.0 // true

这就是说,JavaScript 语言的底层根本没有整数,所有数字都是小数(64位浮点数)。容易造成混淆的是,某些运算只有整数才能完成,此时 JavaScript 会自动把64位浮点数,转成32位整数,然后再进行运算,参见《运算符》一章的“位运算”部分。

由于浮点数不是精确的值,所以涉及小数的比较和运算要特别小心。

0.1 + 0.2 === 0.3
// false

0.3 / 0.1
// 2.9999999999999996

(0.3 - 0.2) === (0.2 - 0.1)
// false
数值精度

根据国际标准 IEEE 754,JavaScript 浮点数的64个二进制位,从最左边开始,是这样组成的。

第1位:符号位,0表示正数,1表示负数
第2位到第12位(共11位):指数部分
第13位到第64位(共52位):小数部分(即有效数字)
符号位决定了一个数的正负,指数部分决定了数值的大小,小数部分决定了数值的精度。

指数部分一共有11个二进制位,因此大小范围就是0到2047。IEEE 754 规定,如果指数部分的值在0到2047之间(不含两个端点),那么有效数字的第一位默认总是1,不保存在64位浮点数之中。也就是说,有效数字这时总是1.xx...xx的形式,其中xx..xx的部分保存在64位浮点数之中,最长可能为52位。因此,JavaScript 提供的有效数字最长为53个二进制位。

(-1)^符号位 * 1.xx...xx * 2^指数部分

上面公式是正常情况下(指数部分在0到2047之间),一个数在 JavaScript 内部实际的表示形式。

精度最多只能到53个二进制位,这意味着,绝对值小于2的53次方的整数,即-253到253,都可以精确表示。

Math.pow(2, 53)
// 9007199254740992

Math.pow(2, 53) + 1
// 9007199254740992

Math.pow(2, 53) + 2
// 9007199254740994

Math.pow(2, 53) + 3
// 9007199254740996

Math.pow(2, 53) + 4
// 9007199254740996

上面代码中,大于2的53次方以后,整数运算的结果开始出现错误。所以,大于2的53次方的数值,都无法保持精度。由于2的53次方是一个16位的十进制数值,所以简单的法则就是,JavaScript 对15位的十进制数都可以精确处理。

Math.pow(2, 53)
// 9007199254740992

// 多出的三个有效数字,将无法保存
9007199254740992111
// 9007199254740992000

上面示例表明,大于2的53次方以后,多出来的有效数字(最后三位的111)都会无法保存,变成0。

参考链接

相关文章

  • JS数值精度

    整数和浮点数 JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,1与1.0是...

  • JS数值

    JS数值 一、JS内部的数值形式和精度 在JS内部,所有的数值都是以64位的浮点数的形式存在的。即使是整数也是如此...

  • [js]数值的精度

    基础知识 js内部所有数字在计算机内存中的表示都是64位双精度浮点数 双精度浮点数表示法的副作用 使用二进制浮点数...

  • JS精度和大数处理

    JS精度和大数处理 1. 引子 众所周知 JavaScript 仅有 Number 这个数值类型,而 Number...

  • mysql8 数据类型 float double decimal

    float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都...

  • JAVA/JS 精度丢失问题

    在JAVA和JS浮点型数值直接计算中,经常会出现一些精度丢失的情况。 JAVA和JS采用的是IEEE 754规范,...

  • 雷潮教育第一期班C#课程阶段总结(1)

    1.基本数据类型 数值类型整型 int单精度浮点型 float双精度浮点型 double更高精度数值(财务) de...

  • 《Java编程思想》笔记——基础知识

    1.基本类型 高精度数值类型: BigInteger和BigDecimal是java中的高精度数值类型,由于它们是...

  • java常见的坑

    数值计算BigDecimalBigDecimal核心是精度,精度如果不匹配,结果大概率不会符合预期 初始化设置精度...

  • js中的数字

    Number对象 可表示的最大的数 Math对象 js中的最大整数 安全整数 当整数数值过大时,就会发生精度丢失 ...

网友评论

      本文标题:JS数值精度

      本文链接:https://www.haomeiwen.com/subject/mkodihtx.html