截断浮点数而不进行舍入
我有一个浮点数,我想截断到3个位置,但我不想舍入。
例如,将1.0155555555555555
转换为1.015
(不是1.016
)。
我将如何在Ruby中执行此操作?
假设你有一个float
,试试这个:
(x * 1000).floor / 1000.0
结果:
1.015
看它在线工作: ideone
您还可以转换为BigDecimal,并在其上调用truncate。
1.237.to_d.truncate(2).to_f # will return 1.23
乘以一千,一层,除以一千,确保做一个浮动分区。
(x * 1000).floor / 1000.0
或者,在Ruby 1.9.2中,使用早期版本中未提供的回合版本,
(x - 0.0005).round(3)
由于ruby 2.4 Float#truncate
方法将可选参数作为多个十进制数字:
1.0155555555555555.truncate(3) # => 1.015
sid的答案很好,但它错过了第一个要求,因此未通过Anwar的测试。 要求我们必须开始生,以便ruby不会轻易转换数字。 并且以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
刚刚分享这个,因为我今天刚刚遇到这个问题:)
这个解决方案基于@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
您可以使用正则表达式执行此操作,因为ruby / rails具有精度限制。
– 首先将数字转换为字符串,然后执行以下操作 –
input =“114.99999999999999999999”
输入[/ \ d + \ d /]
114.99