JS精度丢失

发布时间 2023-11-22 20:15:18作者: 江一乐

精度丢失

JS 数字类型只有number类型,相当于其他强类型语言中的double类型(双精度浮点型),不区分浮点型和整数型。在内部,数字是以 64 位格式 IEEE-754 表示的,所以正好有 64 位可以存储一个数字:其中 52 位被用于存储这些数字,其中 11 位用于存储小数点的位置,而 1 位用于符号。

整数精度丢失

alert( 9999999999999999 ); // 显示 10000000000000000

有 64 位来表示该数字,其中 52 位可用于存储数字,但这还不够。所以最不重要的数字就消失了。JavaScript 不会在此类事件中触发 error

小数精度丢失

  • 整数转二进制用除二取余法;小数转二进制用乘二取整法。问题就在于小数乘二取整会有无限循环的情况。所以使用二进制数字系统无法 精确 存储 0.10.2

解决方法

  • 将小数转化为整数进行运算:因为小数乘二取整会有无限循环的情况,但是整数除二取余是不会的
  • 限制精度,只保留小数部分位数:因为小数精度过高的情况下可能出现无限循环
  • 第三方库:math.jsbignumber.jsdecimal.jsbig.jsnumber-precision