Skip to main content

精度问题

问题描述

由于JS语言在整型中有最大安全值最小安全值的概念,最大值可以通过Number.MAX_SAFE_INTEGER来获取,其内容为:Math.pow(2, 53) - 1,十六进制表示为:1F FFFF FFFF FFFF9千万亿多,通常来说用不到,但是在很多情况下是会遇到Int64UInt64Double类型数据的编解码的(主要是受C 语言影响),那么从C 语言64位数转换到JS这边,就会遇到问题,出现精度丢失的情况。

tip

最小安全值 = - 最大安全值,即:-1F FFFF FFFF FFFF

解决思路

思路 1

JS 本身也有大数据的需求,因此社区也衍生出了很多轮子,像big.jsdecimal.js以及bignumber.js,引入这些确实能解决这个问题,但是相应的就会造成对原生语法的侵蚀,在写法上要用特殊写法才行,很多地方不好互通。这样的话成本就太高了。

思路 2

JS默认的安全范围9千万亿多在大部分场景下也足够使用了,相比于UInt32的不到43万也大了很多,所以可以考虑舍弃超精度的情况,仅仅使用安全范围即可。

最终实现

目前来看,我们用到大数据的情况不多,因此先采用思路2来实现。