在Ruby中舍入浮点数

use*_*662 145 ruby ruby-on-rails rounding

我有问题四舍五入.我有一个浮点数,我想要舍入到十进制的十分之一.但是,我只能使用.round哪个基本上把它变成一个int,意思2.34.round # => 2. 是有一种简单的效果方式来做类似的事情2.3465 # => 2.35

Ste*_*eet 382

将参数传递给包含要舍入的小数位数的round

>> 2.3465.round
=> 2
>> 2.3465.round(2)
=> 2.35
>> 2.3465.round(3)
=> 2.347
Run Code Online (Sandbox Code Playgroud)

  • 这似乎比乘法,舍入和分割更合理.+1 (8认同)
  • 嗯,这种方法似乎不是红宝石1.8.7.也许在1.9? (3认同)
  • Ruby 1.8.7的round方法没有这个能力,添加小数位舍入参数是1.9的能力 (3认同)
  • @布赖恩.这绝对是在1.9并且也在rails(这个问题标记为) (2认同)
  • 请注意,你不会得到尾随零,所以 `1.1.round(2)` => `1.1` 不是 `1.10` (2认同)

Pet*_*ter 177

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

>> '%.2f' % 2.3465
=> "2.35"
Run Code Online (Sandbox Code Playgroud)

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

>> (2.3465*100).round / 100.0
=> 2.35
Run Code Online (Sandbox Code Playgroud)

  • value.round(2)比这个解决方案更好 (64认同)
  • @Excalibur`2.3000.round(2)`是一个数字,而不是一个字符串.数字"2.3"无法与"2.30"不同,因此无法选择保留尾随零.您可以创建自己的numbers_with_significance类,但之后我们已经有了字符串. (12认同)
  • 请记住,`2.3000.round(2)=> 2.3`和'sprintf'%.2f',2.300 => 2.30`.在我看来,这是round()中的一个缺陷,或者它应该有一个保留尾随零的选项. (10认同)
  • 请注意,尽管**确实*适用于两位小数,但是'%.3f'%1.2345`(3位小数,而不是2位)存在缺陷,但是!! 对于'sprintf`也是如此.谨防.这将返回`=> 1.234`**而不是**= => 1.235`正如大多数人所期望的那样(哇,在第二个小数后,sprintf向下旋转5**向下**并且仅向上舍入6个向上).这就是为什么Kit Ho的评论有25个以上的评论.更安全,`'%.3f'%1.2345.round(3)`所以首先用`.round`对数字进行正确舍入,然后格式化(如果需要,用尾随零). (6认同)
  • 谢谢.我没有意识到sprintf会照顾我的四舍五入.`sprintf'%.2f',2.3465`也有效. (2认同)

Alb*_*alà 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
Run Code Online (Sandbox Code Playgroud)


小智 7

你可以用它来四舍五入..

//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          
Run Code Online (Sandbox Code Playgroud)