为什么不同语言对 99.1*1.05 的四舍五入结果不一样

查看 70|回复 8
作者:unspring   
今天开发的时候碰到一个问题
nodejs 在计算
(99.1 *1.05).toFixed(2)
时的输出是 104.05
而 Ruby 计算
(99.1*1.05).round(2)
时的输出是 104.06
我还试了下其他语言 Python 和 nodejs 是一样的
Excel 和 Ruby 的输出是一样的
99.1*1.05 的结果是 104.05499999999999
但不同语言对这个数字的舍入处理却不同
感觉 nodejs 这么流行的语言不太会出现这种问题
发个贴来问下大家的看法

Nodejs, Ruby, 语言, 输出

masterjoess   
因为 toFixed 不是四舍五入
Puteulanus   
104.06 感觉像奇进偶舍的结果
henix   
js 的四舍五入应该是:Math.round(99.1*1.05*100)/100 // => 104.06
codehz   
因为 ruby 的实现里
https://github.com/ruby/ruby/blob/master/numeric.c#L2536C13-L2536C25
发现数字的小数位数大于 14 位就会用另一个算法了
jhdxr   
因为这些不是一个问题/bug 而是一个 feature 。
Floating Point Precision ,属于我能想到的最常见的科班知道而非科班甚至不会意识到这东西存在的一个问题。
thinkershare   
浮点数常用的舍入有 6/7 种,每种舍入都有自己的具体使用场景。你先搞清楚,每个方法的具体舍入算法再看。
只要使用的是 IEEE64 ,则最终同一个算法的结果应该是相同的。
unspring
OP
  
@henix 这个做法感觉更像是 double 转成 long 再转回来,感觉不是通用解法
程序员在意识到这个问题之前不会这么处理,而这个问题也难以发现
unspring
OP
  
@codehz 震惊,居然能迅速翻到源码
js 对这种场景居然就没处理吗
您需要登录后才可以回帖 登录 | 立即注册

返回顶部