JS-Number 的精度

JS 使用 IEEE 754 的双精度数表示数字,1 位符号,10 位指数,53 位底数。

所以 JS 数字精度近似为 15.95 位 10 进制(10 ** 15.95)。

也就是说整部加小数部分超过 15 位再用 Number 类型就不合适了,可以使用 JS 的BigInt类型,也可以使用peterolson/BigInteger.jsrauschma/strint(有 bug,代码少可以用来学习)等库用字符串进行计算。

注:准确来说精度是2 ** 53 = 9007199254740992(可以使用Number.MAX_SAFE_INTEGER检查),超过这个值计算出来的数据就不准了,例如:

> 2 ** 53
9007199254740992
> 2 ** 53 + 1
9007199254740992(false)
> 2 ** 53 + 2
9007199254740994(true)
> 2 ** 53 + 3
9007199254740996(false)

// PS: 使用 BigInt
> 2n ** 53n + 1n
9007199254740993n(true)
> 2n ** 53n + 2n
9007199254740994n(true)
> 2n ** 53n + 3n
9007199254740995n(true)
> (2n ** 53n + 3n).toString()
'9007199254740995'

// Number.MAX_SAFE_INTEGER
Number.MAX_SAFE_INTEGER == 2**53 - 1

wiki 上的《IEEE 754 基本交换格式表》,binary64 就是 JS 中用的

NameCommon nameBaseSignificand Bits[b]/DigitsDecimal digitsExponent bitsDecimal E maxExponent bias[10]E minE maxNotes
binary16Half precision2113.3154.5124−1 = 15−14+15not basic
binary32Single precision2247.22838.2327−1 = 127−126+127
binary64Double precision25315.9511307.95210−1 = 1023−1022+1023

参考:

转载于:https://www.cnblogs.com/jffun-blog/p/10327322.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值