红宝石中的舍入浮点


150

我在四舍五入时遇到问题。我有一个浮点数,我想四舍五入到小数点后一位。但是,我只能使用.round基本上将其转换为int的含义,这意味着2.34.round # => 2. 是否有一种简单的效果方法可以执行以下操作2.3465 # => 2.35

Answers:


181

显示时,您可以使用(例如)

>> '%.2f' % 2.3465
=> "2.35"

如果要四舍五入存储,可以使用

>> (2.3465*100).round / 100.0
=> 2.35

2
谢谢。我不知道sprintf会为我舍入。 sprintf '%.2f', 2.3465也可以。
Noah Sussman 2012年

66
value.round(2)优于此解决方案
Kit Ho

12
请记住2.3000.round(2) => 2.3sprintf '%.2f', 2.300 => 2.30。在我看来,这是round()的缺陷,或者应该有保留尾随零的选项。
神剑2014年

14
@Excalibur 2.3000.round(2)是数字,而不是字符串。该数字与2.3完全不同2.30,因此没有办法保留尾随零。您可以创建自己的numbers_with_significance类,但是那时我们已经有了字符串。
Roobie Nuby 2014年

6
请注意,尽管这确实适用于两个小数位,但是存在缺陷'%.3f' % 1.2345(3个小数位,而不是2个小数)!同样sprintf也是如此。谨防。那将返回=> 1.234 不像 => 1.235大多数人期望的那样(现在,小数点后第二位,sprintf 向下舍入5 而向上舍入6)。这就是为什么Kit Ho上面的评论有25多个投票的原因。使用起来更安全,'%.3f' % 1.2345.round(3)因此先对数字进行适当的四舍五入.round,然后再进行格式化(如果需要,可以使用尾随零)。
likethesky '16

392

将参数传递给舍入,其中包含要舍入的小数位数

>> 2.3465.round
=> 2
>> 2.3465.round(2)
=> 2.35
>> 2.3465.round(3)
=> 2.347

8
这似乎比乘法,舍入和除法更明智。+1
马克·艾姆伯恩

3
嗯,这种方法似乎不是在红宝石1.8.7中。也许在1.9中?
布莱恩·阿姆斯特朗

2
@布莱恩。这绝对是1.9版,也存在问题(标记有这个问题)
Steve Weet 2011年

3
Ruby 1.8.7的round方法没有此功能,添加小数位舍入参数为1.9功能
bobmagoo 2013年

1
请注意,您不会由此得到尾随零,所以1.1.round(2)=> 1.1not1.10
NotAnAmbiTurner

9

您可以将其用于精确到四舍五入。

//to_f is for float

salary= 2921.9121
puts salary.to_f.round(2) // to 2 decimal place                   

puts salary.to_f.round() // to 3 decimal place          

7

您可以在Float类中添加一个方法,我是从stackoverflow中学到的:

class Float
    def precision(p)
        # Make sure the precision level is actually an integer and > 0
        raise ArgumentError, "#{p} is an invalid precision level. Valid ranges are integers > 0." unless p.class == Fixnum or p < 0
        # Special case for 0 precision so it returns a Fixnum and thus doesn't have a trailing .0
        return self.round if p == 0
        # Standard case  
        return (self * 10**p).round.to_f / 10**p
    end
end

3

您还可以提供负数作为round方法的参数,以四舍五入到最接近的10、100等倍数。

# Round to the nearest multiple of 10. 
12.3453.round(-1)       # Output: 10

# Round to the nearest multiple of 100. 
124.3453.round(-2)      # Output: 100

2
def rounding(float,precision)
    return ((float * 10**precision).round.to_f) / (10**precision)
end


1

如果只需要显示它,我将使用number_with_precision帮助器。如果您在其他地方需要它,正如Steve Weet指出的,我会使用该round方法


1
请注意,这number_with_precision是仅用于Rails的方法。
Smar

0

对于ruby 1.8.7,可以在代码中添加以下内容:

class Float
    alias oldround:round
    def round(precision = nil)
        if precision.nil?
            return self
        else
            return ((self * 10**precision).oldround.to_f) / (10**precision)
        end 
    end 
end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.