Ответы:
Float # round может принимать параметр в Ruby 1.9, а не в Ruby 1.8. По умолчанию JRuby равен 1.8, но он может работать в режиме 1.9 .
(5.65235534).round(2)
#=> 5.65
(5.6).round(2)
возвращается только 5,6
sprintf('%.2f', number)
это загадочный, но очень мощный способ форматирования чисел. Результатом всегда является строка, но так как вы округляете, я предполагаю, что вы все равно делаете это для целей презентации. sprintf
можно форматировать любое число практически любым удобным вам способом и многое другое.
Полная документация по sprintf: http://www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-sprintf
'%.2f' % number
Также работы чаще можно увидеть, по крайней мере, по моему опыту.
sprintf
(или format
) %
версии. Некоторые рассуждения об этом обсуждаются здесь , в основном о читабельности. Не то чтобы мы все следовали руководству по стилю, просто приводя некоторые причины :)
0.566666666666666
округляет до0.57
"%.2f"
округляет 5
, а не вверх, есть ли способ это исправить?
После получения отзыва кажется, что оригинальное решение не сработало. Вот почему обновил ответ в качестве одного из предложений.
def float_of_2_decimal(float_n)
float_n.to_d.round(2, :truncate).to_f
end
Другие ответы могут работать, если вы хотите иметь округленные числа 2 десятичных знака. Но, если вы хотите иметь числа с плавающей запятой с первыми двумя десятичными знаками без округления , эти ответы не помогут.
Итак, чтобы получить число с плавающей запятой с первыми двумя десятичными знаками, я использовал эту технику. Не работает в некоторых случаях
def float_of_2_decimal(float_n)
float_n.round(3).to_s[0..3].to_f
end
с 5.666666666666666666666666
, он вернется 5.66
вместо округленного 5.67
. Надеюсь, это поможет кому-то
def float_of_2_decimal(float_n) num = float_n.to_s.split('.') num[1] = num[1][0..1] num.join(".").to_f end
Или гораздо проще, вы можете использоватьfloat_n.to_d.round(2, :truncate).to_f
11111111111111111.222222222222222
качестве входных данных первый показывает, 1.11
а второй показывает1.11111111111111e+16
Попробуй это:
module Util
module MyUtil
def self.redondear_up(suma,cantidad, decimales=0)
unless suma.present?
return nil
end
if suma>0
resultado= (suma.to_f/cantidad)
return resultado.round(decimales)
end
return nil
end
end
end
чтобы усечь десятичное число, я использовал следующий код:
<th><%#= sprintf("%0.01f",prom/total) %><!--1dec,aprox-->
<% if prom == 0 or total == 0 %>
N.E.
<% else %>
<%= Integer((prom/total).to_d*10)*0.1 %><!--1decimal,truncado-->
<% end %>
<%#= prom/total %>
</th>
Если вы хотите сократить до 2 десятичных знаков, вы должны использовать Integr(a*100)*0.01