截断浮点数而不进行舍入

我有一个浮点数,我想截断到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