精度丢失
JS 数字类型只有number类型,相当于其他强类型语言中的double类型(双精度浮点型
),不区分浮点型和整数型。在内部,数字是以 64 位格式 IEEE-754 表示的,所以正好有 64 位可以存储一个数字:其中 52 位被用于存储这些数字,其中 11 位用于存储小数点的位置,而 1 位用于符号。
整数精度丢失
alert( 9999999999999999 ); // 显示 10000000000000000
有 64 位来表示该数字,其中 52 位可用于存储数字,但这还不够。所以最不重要的数字就消失了。JavaScript 不会在此类事件中触发 error
小数精度丢失
- 整数转二进制用除二取余法;小数转二进制用乘二取整法。问题就在于小数乘二取整会有无限循环的情况。所以使用二进制数字系统无法 精确 存储 0.1 或 0.2
解决方法
- 将小数转化为整数进行运算:因为小数乘二取整会有无限循环的情况,但是整数除二取余是不会的
- 限制精度,只保留小数部分位数:因为小数精度过高的情况下可能出现无限循环
- 第三方库:math.js、bignumber.js、decimal.js 、big.js、number-precision