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

时间:2010-10-01 07:18:15

标签: 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

3 个答案:

答案 0 :(得分:32)

class Float
  def round_point5
    (self * 2).round / 2.0
  end
end

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

答案 1 :(得分:13)

将数字乘以2。

四舍五入到整数。

除以二。

(x * 2.0).round / 2.0

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

(x * notches).round / notches

答案 2 :(得分:1)

您也可以使用modulo运算符完成此操作。

(x + (0.05 - (x % 0.05))).round(2)

如果x = 1234.56,则返回1234.6

我偶然发现了这个答案,因为我正在编写一个基于Ruby的计​​算器,它使用Ruby的Money库来完成所有的财务计算。 Ruby Money对象没有与Integer或Float相同的舍入函数,但它们可以返回余数(例如modulo,%)。

因此,使用Ruby Money,您可以使用以下内容将Money对象舍入到最接近的$ 25:

x + (Money.new(2500) - (x % Money.new(2500)))

在这里,如果x = $ 1234.45(< #Money fractional:123445货币:USD>),那么它将返回$ 1250.00(#

注意:没有必要使用Ruby Money对象进行舍入,因为该库会为您处理它!