新手问题 异常浮点数的处理

Awlter1 · 2019年06月27日 · 最后由 msg7086 回复于 2019年06月27日 · 1248 次阅读
2.3.3 :001 > 51.48 + 12.48 + 11.52
 => 75.47999999999999 #1
2.3.3 :002 > 51.48 + 77.48 + 71.52
 => 200.48000000000002 #2

像这样的浮点数大家都是怎么处理的

前提

  • 不能强制精确到小数点后 N 位
  • 最理想的结果就是把连续的 0 以及后面的数字干掉 (#1), 或者合理的补位 (#2)
2.3.3 :019 > a
 => 200.48000000000002
2.3.3 :020 > b
 => 75.47999999999999
2.3.3 :021 > b.next_float
 => 75.48
2.3.3 :022 > a.prev_float
 => 200.48

大概用这两个方法?

你要想精确的话只能用 BigDecimal 了,next_float 不靠谱

[1] pry(main)> (1.1).next_float
=> 1.1000000000000003

本来正常的数,反而引发了问题

干掉的话一般是round 一下,但又不满足你说的 “不能强制精确到小数点后 N 位”

jasl 回复

Thanks! BigDecimal 解决问题了!

BigDecimal 支持各种进位方式不用你烦恼直接调用就行

浮点数不精确。精确值严禁用浮点。这样的基础知识还是要有的,和 round 还是 next 没关系。

在浮点数里,200.48000000000002 与 200.48 是应该被程序员视作相等的值。

即判断两者相等的操作 is_equal = (200.48000000000002 - 200.48).abs < 1e-6 返回的是 true

需要 登陆 后方可回复, 如果你还没有账号请 注册新账号