2009-10-02 2 views
4

Сортировка быстрого вопроса. Я пишу:Sprintf in Ruby

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

1

вам, вероятно, потребуется усечь числа с точностью, которую вы хотите.

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

жаль? не могли бы вы привести пример? – gmile

+1

Я не уверен, что вы подразумеваете под «ограничением округления». В частности, какой результат вы ищете в приведенном выше примере? –

+0

Я просто хочу, чтобы мои номера «как есть»: 3,998 3,9988 3,99887 – gmile

-2

Чтобы получить цифры «как есть», вы должны хранить их как строки. Как только вы представляете их как поплавки, вы теряете информацию о количестве встроенной точности.

+0

Почему бы не сохранить их в качестве рациональных чисел? –

+0

зависит от того, что вы хотите сделать с ними позже, я думаю. – Peter

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"