Nemo

Nemo 关注TA

路漫漫其修远兮,吾将上下而求索。

Nemo

Nemo

关注TA

路漫漫其修远兮,吾将上下而求索。

  • 加入社区3,261天
  • 写了1,496,113字

该文章投稿至Nemo社区   Js、Css、Html  板块 复制链接


JS 小数相加运算精度丢失

发布于 2018/09/06 18:46 4,636浏览 0回复 617

输入:1.45 + 0.31
输出:1.76

输入:1.45 + 0.32
输出:1.77

输入:1.45 + 0.33
输出:1.78

输入:1.45 + 0.34
输出:1.79

输入:1.45 + 0.35
输出:1.7999999999999998

输入:1.45 + 0.36
输出:1.81

输入:1.45 + 0.37
输出:1.8199999999999998

输入:1.45 + 0.38
输出:1.83

输入:1.45 + 0.39
输出:1.8399999999999999


...

可以看到,一些情况下,比如:

1.45 + 0.35

按正常来说,计算结果应该是:

1.80

但是却输出了:

1.7999999999999998
显然出现了精度丢失。


解决:

 java和JavaScript中计算小数运算时,都会先将十进制的小数换算到对应的二进制,一部分小数并不能完整的换算为二进制,这里就出现了第一次的误差。

解决方案:先把小数转成整数,使用整数来进行加减。

输入:(1.45 * 10 + 0.35 *10)/10
输出:1.8


当然,这里要判断下相加两方的小数位数,根据小数位数来决定10的幂数。

输入:(1.451 * 1000 + 0.35 *1000)/1000
输出:1.801

这里的小数最大小数位数为3,所以选取了10的3次幂。

本文标签
 {{tag}}
点了个评