这看起来非常低效。有人可以给我一个更好的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
答案 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对象进行舍入,因为该库会为您处理它!