1

我想将 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”(正确)

4

3 回答 3

9

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

您正在寻找的答案:

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

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。

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

于 2013-03-23T17:47:00.750 回答
3

看起来有问题的数字确实应该四舍五入到 0.02 而不是 0.03——我相信这里没有实际问题。.024 舍入为 0.02

于 2012-04-10T14:47:02.093 回答
0

如果您希望 43382.0249 为 42283.03,则首先添加 0.001 如果您希望 670.1541 为 670.16,则首先添加 0.001

向下/向上舍入 < 0.005,您似乎想要 < 0.006。

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

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

于 2012-04-10T14:46:51.460 回答