我得到的数字像这样:
2.36363636363636
4.567563
1.234566465448465
10.5857447736
我该如何让 Ruby 将这些数字四舍五入到最接近的 0.05?
我得到的数字像这样:
2.36363636363636
4.567563
1.234566465448465
10.5857447736
我该如何让 Ruby 将这些数字四舍五入到最接近的 0.05?
[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]
ceil
而不是round
。 - sepp2k看看这个链接,我认为它就是你需要的。 Ruby rounding
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
通常“四舍五入到最近的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,所以语法可能不正确,但我相信你可以理解。
(7.125 * 20).round / 20.0 => 7.15
。 - Pratik Khadloya要四舍五入到最接近的两位小数:
(5.65235534).round(2)
#=> 5.65
库中的位置:
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)
hth.
Ruby 2现在有一个round函数:
# Ruby 2.3
(2.5).round
3
# Ruby 2.4
(2.5).round
2
在 Ruby 2.4 中也有一些选项,如::even
、:up
和 :down
。
(4.5).round(half: :up)
5
可以使用String
类的%
方法对数字进行四舍五入。
例如:
"%.2f" % 5.555555555
结果将是"5.56"
(一个字符串)。
我知道这个问题很老了,但我想与世界分享我的发明,以帮助他人:这是一种用于按步骤舍入浮点数、将小数舍入到最接近的给定数字的方法;例如,它对于舍入产品价格非常有用:
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