欢迎光临散文网 会员登陆 & 注册

javascript中如何解决精度丢失问题

2023-09-05 15:07 作者:bengdour  | 我要投稿

在项目开发中,你一定遇到过精度丢失的问题!比如某个无良的后端返回了一个超16位的数字订单号,比如0.1+0.2 != 0.3等等:



01

精度丢失的原因

是什么原因造成的捏?

嗯〜大道理咱也不会说,问就是一句话回复:

在十进制转二进制的过程中,因js存储位数有限制,末位就会0舍1入取近似值,从而导致再转回十进制时产生误差。



02

如何解决

  • 使用toPrecision; 

  • 乘以10的N次幂转换成整数,再除以N次幂转回小数;

  • 先加上1e-14或Number.EPSILON再取值;

  • 使用第三方库,处理大数的 bignumber.js,处理小数的number-precision 和 decimal.js,处理JSON序列化json-bigint。

使用toPrecision

这个方法主要用于纯展示。先用toPrecision保留一定位数的经度,再通过parseFloat展示。

例如:

这个12是精度默认值或者说是一个经验值,12位一般都能解决0000...1和0000...9的问题。一般不适合浮点数的运算。


先转整数进行运算,再转成小数

这种方式是我之前浮点运算时经常用到的方法。我们拿0.1+0.2的运算来举例:

但这种方法也不是万能的,有时候也会失精:

真是防不胜防啊!这时候我们也可以使用Math.round()方法来达到我们的目的,如下:


先加上1e-14或Number.EPSILON再取值

给浮点数加上一个极小的数就可以达到目的。获取极小的数有两种方式:

  • 1e-14(10的-14次方)

  • ES6的极小的常量Number.EPSILON


先来看看Number.EPSILON是什么?

这两种方式都可以,看自己的喜好啦!


第三方库

第三方库主要介绍以下四种:

  • bignumber.js的使用-处理大数

安装:

引入:

使用:

官网:https://mikemcl.github.io/bignumber.js/

  • number-precision的使用-处理小数

安装:

引入:

使用:


  • number-precision的使用-处理小数

安装:

引入:

使用:

上面的结果是Decimal 对象,取值需要Number 或 String转换

官网:http://mikemcl.github.io/decimal.js/


  • json-bigint的使用-处理后端的返回值

安装:

引入:

使用:

主要是把大数据转成字符串。其实关于这一点,如果后端经验丰富的话,自然会给前端返回字符串,也无需前端转换。不过呢,可能前端的技能的提升也就是从无经验的后端开始的噢!



javascript中如何解决精度丢失问题的评论 (共 条)

分享到微博请遵守国家法律