Ruby BigDecimal四舍五入

时间:2012-04-10 14:33:38

标签: ruby

我想将BigDecimal舍入到2位小数,但是当使用round方法时,它似乎不会加倍:

BigDecimal.new('43382.0249').round(2).to_s('F').should == '43382.03'

但相反,我得到输出:43382.02

我还尝试了所有其他可用的舍入模式,ROUND_UP似乎可以完成这项工作,但它会搞砸其他舍入方案,例如'670.1541'变为'670.16'(不正确)而不是'670.15'(正确)

3 个答案:

答案 0 :(得分:8)

正确答案:您正在做的事情被称为“创意四舍五入”。如果您正在使用会计系统,这也称为“欺诈”。你不应该像这样“围绕”。

您正在寻找的答案:

您可以使用执行以下操作的算法来完成此操作:

x = the number of decimal places you would like to consider
y = the number of decimal placed you would like left when you are re done
while( x >= y )
    round your number to x places
    x = x-1

所以在红宝石中:

my_num = 1.2349
x = 100
y = 2
x.downto y do |i|
    my_num = my_num.round i
end
puts my_num

这给了我们1.24,如果my_num是1.2341,它会给我们1.23。

明智地使用,如果可能的话?

答案 1 :(得分:3)

看来有问题的数字确实应该是.02而不是.03 - 我相信这里没有实际问题。 .024轮到0.02

答案 2 :(得分:0)

如果你想让43382.0249为42283.03,那么先添加0.001 如果你想670.1541是670.16那么先添加0.001

向下/向上< 0.005,你似乎想要< 0.006

注意,如果你的数字可以是负数,那么它是-0.001

无论如何都要玩,但只要你保持一致,基本的想法就应该有效。