将ruby浮动向上或向下滚动至最接近的0.05

我得到的数字就像

2.36363636363636 4.567563 1.234566465448465 10.5857447736 

我如何让Ruby将这些数字向上(或向下)舍入到最接近的0.05?

检查这个链接,我认为这是你需要的。 Ruby舍入

 class Float def round_to(x) (self * 10**x).round.to_f / 10**x end def ceil_to(x) (self * 10**x).ceil.to_f / 10**x end def floor_to(x) (self * 10**x).floor.to_f / 10**x end end 
 [2.36363636363636, 4.567563, 1.23456646544846, 10.5857447736].map do |x| (x*20).round / 20.0 end #=> [2.35, 4.55, 1.25, 10.6] 

通常,“舍入到最近的x ”的算法是:

 round(x / precision)) * precision 

有时最好乘以1 / precision因为它是一个整数(因此它的工作速度更快):

 round(x * (1 / precision)) / (1 / precision) 

在你的情况下,将是:

 round(x * (1 / 0.05)) / (1 / 0.05) 

哪个会评估为:

 round(x * 20) / 20; 

我不知道任何Python,所以语法可能不正确,但我相信你可以搞清楚。

不太精确,但这种方法是大多数人用Google搜索此页面的方法

 (5.65235534).round(2) #=> 5.65 

这是一个按任何给定步长值舍入的通用函数:

放在lib中:

 lib/rounding.rb class Numeric # round a given number to the nearest step def round_by(increment) (self / increment).round * increment end end 

和规格:

 require 'rounding' describe 'nearest increment by 0.5' do {0=>0.0,0.5=>0.5,0.60=>0.5,0.75=>1.0, 1.0=>1.0, 1.25=>1.5, 1.5=>1.5}.each_pair do |val, rounded_val| it "#{val}.round_by(0.5) ==#{rounded_val}" do val.round_by(0.5).should == rounded_val end end end 

和用法:

 require 'rounding' 2.36363636363636.round_by(0.05) 

心连心。

可以使用String类的%方法对数字进行舍入。

例如

 "%.2f" % 5.555555555 

会给出"5.56"作为结果(一个字符串)。

Ruby 2现在有一个圆函数:

 # Ruby 2.3 (2.5).round 3 # Ruby 2.4 (2.5).round 2 

ruby 2.4还有以下选项::: :even:up:down eg;

 (4.5).round(half: :up) 5 

要获得没有小数的舍入结果,请使用Float的.round

 5.44.round => 5 5.54.round => 6 

我知道问题是陈旧的,但我喜欢与世界分享我的发明以帮助他人:这是一种用步骤舍入浮点数,将小数舍入到最接近给定数的方法 ; 它对于舍入产品价格很有用,例如:

 def round_with_step(value, rounding) decimals = rounding.to_i rounded_value = value.round(decimals) step_number = (rounding - rounding.to_i) * 10 if step_number != 0 step = step_number * 10**(0-decimals) rounded_value = ((value / step).round * step) end return (decimals > 0 ? "%.2f" : "%g") % rounded_value end # For example, the value is 234.567 # # | ROUNDING | RETURN | STEP # | 1 | 234.60 | 0.1 # | -1 | 230 | 10 # | 1.5 | 234.50 | 5 * 0.1 = 0.5 # | -1.5 | 250 | 5 * 10 = 50 # | 1.3 | 234.60 | 3 * 0.1 = 0.3 # | -1.3 | 240 | 3 * 10 = 30