在Ruby中设置float的显示精度

时间:2009-12-19 19:49:52

标签: ruby floating-point precision

是否可以在Ruby中设置浮动的显示精度?

类似的东西:

z = 1/3
z.to_s    #=> 0.33333333333333
z.to_s(3) #=> 0.333
z.to_s(5) #=> 0.33333

或者我是否必须覆盖to_s的<{1}}方法?

5 个答案:

答案 0 :(得分:76)

z.round(2)x.round(3)是最简单的解决方案。请参阅http://www.ruby-doc.org/core-1.9.3/Float.html#method-i-round

那就是说,这只会确保它不会超过那么多位数。在1/3的情况下很好,但是如果你说0.25.round(3)你会得到0.25,而不是0.250。

答案 1 :(得分:43)

您可以使用sprintf:

sprintf( "%0.02f", 123.4564564)

答案 2 :(得分:35)

我通常只是在开放代码中进行转换,例如:

puts "%5.2f" % [1.0/3.0] 

Ruby为这样的表达式调用Kernel#format,因为String上有core operator % defined。将它想象为 printf for Ruby ,如果它为你敲响了任何铃声。

答案 3 :(得分:2)

Rubocop建议在#sprintf上使用#format,并使用带注释的字符串标记。

#format的语法为

%[flags][width][.precision]type

示例:

# Ensure we store z as a float by making one of the numbers a float.
z = 1/3.0

# Format the float to a precision of three.
format('%<num>0.3f', num: z)
# => "0.333"

format('%<num>0.5f', num: z)
# => "0.33333"

# Add some text to the formatted string
format('I have $%<num>0.2f in my bank account.', num: z)
# => "I have $0.33 in my bank account."

参考:

答案 4 :(得分:0)

你可以使用puts

z = #{'%.3f' % z}