圆形小数的Ruby实现更接近0.5

Ste*_*ney 20 ruby math decimal rounding

这似乎非常低效.有人可以给我一个更好的Ruby方式.

def round_value
  x = (self.value*10).round/10.0 # rounds to two decimal places
  r = x.modulo(x.floor) # finds remainder
  f = x.floor

  self.value = case
  when r.between?(0, 0.25)
    f
  when r.between?(0.26, 0.75)
    f+0.5
  when r.between?(0.76, 0.99)
    f+1.0
  end
end
Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 33

class Float
  def round_point5
    (self * 2).round / 2.0
  end
end
Run Code Online (Sandbox Code Playgroud)

一个经典问题:这意味着你正在使用不同的基数进行整数舍入.您可以将'2'替换为任何其他数字.

  • 永远不要修补标准的Ruby对象.在Helper或某种Utility PORO中实现它.可测试性的主要原因.你真的想在`/ specs`目录中使用`stdlib/float_spec.rb`吗?第二个是如果你想将它应用于逻辑到其他数字/十进制类型?BigDecimal等.你也必须修补那些对象 - 并编写和维护更多的测试! (2认同)

Jos*_*shD 13

将数字乘以2.

四舍五入到整数.

除以2.

(x * 2.0).round / 2.0
Run Code Online (Sandbox Code Playgroud)

在一般化形式中,您乘以每个整数所需的凹槽数(比如说圆形到.2是每个整数值的五个凹槽).然后回合; 然后除以相同的值.

(x * notches).round / notches
Run Code Online (Sandbox Code Playgroud)