Спринтф в рубине - PullRequest
       26

Спринтф в рубине

4 голосов
/ 03 октября 2009

Вроде быстрый вопрос. Я пишу:

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

и получите следующий вывод:

3.999 3.9989 3.99888

sprintf просто округляет числа. Как мне ограничить это округление?

Ответы [ 4 ]

7 голосов
/ 04 октября 2009
>> 3.998877.to_s[/^\d+\.\d{3}/].to_f
=> 3.998
>> 3.998877.to_s[/^\d+\.\d{4}/].to_f
=> 3.9988
2 голосов
/ 03 октября 2009
>> 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"
1 голос
/ 03 октября 2009

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

f = 3.1919183
puts (f * 1000).truncate() / 1000
0 голосов
/ 03 октября 2009

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

...