Вроде быстрый вопрос. Я пишу:
puts "%.3f %.4f %.5f" % [3.998877, 3.998877, 3.998877]
и получите следующий вывод:
3.999 3.9989 3.99888
sprintf просто округляет числа. Как мне ограничить это округление?
>> 3.998877.to_s[/^\d+\.\d{3}/].to_f => 3.998 >> 3.998877.to_s[/^\d+\.\d{4}/].to_f => 3.9988
>> 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"
вам, вероятно, нужно будет обрезать числа с точностью, которую вы хотите.
f = 3.1919183 puts (f * 1000).truncate() / 1000
Чтобы получить числа «как есть», вы должны хранить их как строки. Как только вы представляете их как числа с плавающей точкой, вы теряете информацию о величине встроенной точности.