截断浮点数而不进行舍入

时间:2011-11-12 18:43:07

标签: ruby math floating-point decimal precision

我有一个浮点数,我想截断到3个位置,但我不想舍入。

例如,将1.0155555555555555转换为1.015(不是1.016)。

我将如何在Ruby中执行此操作?

8 个答案:

答案 0 :(得分:21)

假设你有一个float,试试这个:

(x * 1000).floor / 1000.0

结果:

1.015

查看在线工作:ideone

答案 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