我有一个浮点数,我想截断到3个位置,但我不想舍入。
例如,将1.0155555555555555
转换为1.015
(不是1.016
)。
我将如何在Ruby中执行此操作?
答案 0 :(得分:21)
答案 1 :(得分:21)
您也可以转换为BigDecimal,并在其上调用truncate。
1.237.to_d.truncate(2).to_f # will return 1.23
答案 2 :(得分:10)
由于 ruby 2.4 Float#truncate
方法将可选参数作为一个小数位数:
1.0155555555555555.truncate(3)
# => 1.015
答案 3 :(得分:8)
乘以一千,一千,除以一千,确保做浮动分割。
(x * 1000).floor / 1000.0
或者,在Ruby 1.9.2中,使用早期版本中未提供的回合版本,
(x - 0.0005).round(3)
答案 4 :(得分:2)
sid的答案很好,但它错过了第一个要求,因此未通过Anwar的测试。要求我们必须开始生产,以便红宝石不会轻易转换数字。并且以raw get开始raw是使用普通字符串,所以
> "59.99999999999999999999".to_d.truncate(2) => #BigDecimal:55a38a23cd68,'0.5999E2',18(45)> > "59.99999999999999999999".to_d.truncate(2).to_s => "59.99" > "59.99999999999999999999".to_d.truncate(2).to_f => 59.99
现在就分享这个,因为我今天刚刚遇到这个问题:)
答案 5 :(得分:0)
这个解决方案基于@SidKrishnan的一个出色的BigDecimal技巧,但是也可以处理更大的浮动,而不会在精度问题上蹒跚而行。
# Truncate a floating-point value without rounding up.
#
# trunc_float(1.999, 2) # => 1.99
# trunc_float(1.999, 0) # => 1.0
#
# @param value [Float]
# @param precision [Integer]
# @return [Float]
def trunc_float(value, precision)
BigDecimal(value.to_s).truncate(precision).to_f
end
#--------------------------------------- Test
describe ".trunc_float" do
def call(*args)
trunc_float(*args)
end
it "generally works" do
[
[[1, 0], 1.0],
[[1.999, 4], 1.999],
[[1.999, 3], 1.999],
[[1.999, 2], 1.99],
[[1.999, 1], 1.9],
[[1.999, 0], 1.0],
[[111111111.9999999, 3], 111111111.999],
[[1508675846.650976, 6], 1508675846.650976],
].each do |input, expected|
output = call(*input)
expect([input, output]).to eq [input, expected]
end
end
end
答案 6 :(得分:0)
您可以使用正则表达式执行此操作,因为ruby / rails具有精度限制。
- 首先将数字转换为字符串,然后执行以下操作 -
input =“114.99999999999999999999”
输入[/ \ d + \ d /]
114.99
答案 7 :(得分:0)
我看到了更“计算”的方法不在答案之内。您可以考虑使用以下方法。
这也将在其他编程语言(例如C / Java / Python等)中起作用(但是转换语法会有所不同)。
q = 1.0155555555555555
(q * 1000).to_i / 1000.0
=> 1.015