2009-10-02 49 views
4

快速問題的分類。我正在寫:Ruby中的Sprintf

puts "%.3f %.4f %.5f" % [3.998877, 3.998877, 3.998877] 

,並得到下面的輸出:

3.999 3.9989 3.99888 

的sprintf簡單地舍入的數字。我如何限制舍入?

回答

7
>> 3.998877.to_s[/^\d+\.\d{3}/].to_f 
=> 3.998 
>> 3.998877.to_s[/^\d+\.\d{4}/].to_f 
=> 3.9988 
+0

不錯的解決方案 – gmile 2009-10-04 13:38:29

1

您可能需要截斷數字以達到所需的精度。

f = 3.1919183 
puts (f * 1000).truncate()/1000 
+0

遺憾?你能舉個例子嗎? – gmile 2009-10-02 22:03:49

+1

我不確定你的意思是「限制四捨五入」。具體來說,你在上面的例子中尋找什麼結果? – 2009-10-02 22:07:55

+0

我只是想讓我的數字'原樣':3.998 3.9988 3.99887 – gmile 2009-10-02 22:09:59

-2

要獲取數字「原樣」,您應該將它們存儲爲字符串。只要你將它們表示爲浮點數,就會失去有關內置精度數量的信息。

+0

爲什麼不把它們存儲爲有理數呢? – 2009-10-03 03:53:14

+0

取決於你以後想要做什麼,我想。 – Peter 2009-10-03 03:55:04

2
>> def truncN f, digits 
>> t = 10.0 ** digits 
>> "%.#{digits}f" % ((f * t).truncate/t) 
>> end 
=> nil 
>> n 
=> 1.11181111 
>> "%.3f" % n 
=> "1.112" 
>> truncN n, 3 
=> "1.111"