1.记得大学第一次学习计算机课,就接触了进制转换;例如,二进制转十进制,十进制转二进制等;例如对于十进制的整数,进行转二进制是没有什么问题的;但是对小数可能进制转换就会出现精读丢失的问题.
在 JavaScript 中所有数值都以 IEEE-754 标准的 64bit
双精度浮点数进行存储的。先来了解下 IEEE-754 标准下的双精度浮点数。
IEEE-754 标准下双精度浮点数由三部分组成,分别如下:
-
sign(符号): 占 1 bit,表示正负。
-
exponent(指数): 占 11 bit,表示范围。
-
mantissa(尾数): 占 52 bit,表示精度,多出的末尾如果是 1 需要进位。
JavaScript 的最大安全数是如何来的.
最大的安全数为 Math.pow(2,53)-1
,即 9007199254740991
。
业务中碰到的精度问题以及解决方案
之前遇到后端的同事传递了long类型的订单号码过来,其中有写订单号码到了前端(会转为Number)显示和后端传递过来的不一致,才知道了有精读丢失的问题;
解决方案大致有以下几种:
-
针对大数的整数可以考虑使用 bigint 类型(目前在 stage 3 阶段)。
-
使用 bigNumber,它的思想是转化成 string 进行处理,这种方式对性能有一定影响。
-
可以考虑使用 long.js,它的思想是将 long 类型的值转化成两个 32 位的双精度类型的值。
暂时记录,后续完善