Как вы округлить поплавок до двух знаков после запятой в jruby?

172

JRuby 1.6.x. Как вы округлите число до запятой в jruby?

number = 1.1164
number.round(2)

The above shows the following error
wrong number of arguments (1 for 0)

Как мне округлить это до 2 десятичных знаков?

Сэм
источник

Ответы:

87

Float # round может принимать параметр в Ruby 1.9, а не в Ruby 1.8. По умолчанию JRuby равен 1.8, но он может работать в режиме 1.9 .

steenslag
источник
1
Я знаю, что Сэм, похоже, не собирается округлять число с целью представления чего-то вроде валюты, но имейте в виду, что использование #round (точность) не будет работать так, как задумано, если вы пытаетесь это сделать (3 .round (2) # => 3,0, а не 3,00). Чтобы получить это, проверьте ответ Тео ниже.
Джаредмит
290
(5.65235534).round(2)
#=> 5.65
boulder_ruby
источник
12
(5.6).round(2)возвращается только 5,6
Бала Картик
3
кажется разумным, что дополнительный нулевой заполнитель все еще там, его просто не видно
boulder_ruby
@BalaKarthik Это та самая причина, почему я использую решение от Тео. Он округляется правильно (за исключением случаев, когда вы проходите 3 знака после запятой по какой-то странной причине, см. Комментарии), так что это лучшее решение, если вы ищете вывод строки.
Дилан Вандер Берг
это правильно. Я генерировал случайную широту и долготу, поэтому я использую number.round (6) для 6 цифр
gsumk
199

sprintf('%.2f', number)это загадочный, но очень мощный способ форматирования чисел. Результатом всегда является строка, но так как вы округляете, я предполагаю, что вы все равно делаете это для целей презентации. sprintfможно форматировать любое число практически любым удобным вам способом и многое другое.

Полная документация по sprintf: http://www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-sprintf

Тео
источник
79
'%.2f' % numberТакже работы чаще можно увидеть, по крайней мере, по моему опыту.
Майкл Коля
6
@MichaelKohl Руководство по стилю ruby предпочитает sprintf(или format) %версии. Некоторые рассуждения об этом обсуждаются здесь , в основном о читабельности. Не то чтобы мы все следовали руководству по стилю, просто приводя некоторые причины :)
Люси Бэйн,
3
обратите внимание, что после третьего десятичного числа sprintf округляется до 6, а не 5, например, sprintf («%. 3f», 1.2225) будет «1.222», sprintf («%. 3f», 1.2226) будет «1.223». ", если это имеет значение для вас, придерживайтесь #round
ecoding5
Но 0.566666666666666округляет до0.57
Анвар
"%.2f"округляет 5, а не вверх, есть ли способ это исправить?
Mirror318
3

редактировать

После получения отзыва кажется, что оригинальное решение не сработало. Вот почему обновил ответ в качестве одного из предложений.

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. Надеюсь, это поможет кому-то

Анвар
источник
1
Это не работает Для того, чтобы заставить его работать, вам нужно учесть любой размер числа. Используя шаблон, реализованный здесь, вы можете: 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
Rorykoehler
Все, что с int больше 9 до десятичного знака
rorykoehler
Спасибо за точку. Но ваши предложенные методы не подходят для больших чисел!
Анвар
В 11111111111111111.222222222222222качестве входных данных первый показывает, 1.11а второй показывает1.11111111111111e+16
Anwar
1
Да, вы правы ... однажды 16 мест впереди или более. Проблема переполнения. Лучше придерживаться большого десятичного числа при работе с большими числами. Typecasting представляет проблему
Rorykoehler
-5

Попробуй это:

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 
HalleyRios
источник
3
Спасибо за ответы. Не могли бы вы изменить его на английском языке, так как вопрос был задан на английском языке.
Джаред
Puedes traducir tu respuesta a inglés? Preguntas у respuestas ан español Deben EXISTIR Aqui .
intcreator
-15

чтобы усечь десятичное число, я использовал следующий код:

<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

Иван Карраско Кироз
источник
5
Никто не должен делать это НИКОГДА при разыгрывании процентов. Это действительно плохая форма, потому что, урезая, вы теряете способность правильно КРУГЛЫТЬ до ближайших 2 десятичных позиций. то есть 0,455, если вы просто усечете, вы получите 0,45, что неправильно для округления, потому что это должно привести к 0,46. Никогда не усекайте десятичную дробь всегда вокруг числа, иначе результат будет неправильным, когда округление должно произойти.
Gugaru