Як округнути поплавок до двох десяткових знаків у джурбі


172

JRuby 1.6.x. Як округлити поплавок до десяткових знаків у джурбі.

number = 1.1164
number.round(2)

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

Як округлити це до двох знаків після коми?

Відповіді:


87

Float # round може приймати параметр у Ruby 1.9, а не у Ruby 1.8. JRuby за замовчуванням до 1,8, але він може працювати в режимі 1.9 .


1
Я знаю, що, мабуть, Сам не має наміру округлювати число з метою подання чогось на зразок валюти, але майте на увазі, що використання #round (точності) не буде працювати, як потрібно, якщо ви намагаєтесь це зробити (3 навколо (2) # => 3,0, а не 3,00). Щоб отримати це, перегляньте відповідь Тео нижче.
Джаредсміт

290
(5.65235534).round(2)
#=> 5.65

12
(5.6).round(2)повертається лише 5.6
Бала Картик

3
здається розумним, що додатковий нульовий заповнювач все ще є, його просто не видно
boulder_ruby

@BalaKarthik Саме тому я використовую рішення від Theo. Він округляється правильно (за винятком випадків, коли ви проходите через 3 десяткових знаки з якоїсь дивної причини, див. Коментарі), тож це краще рішення, якщо ви шукаєте вихідний рядок.
Ділан Вандер Берг

це правильно. Я був генерацією випадкової широти і довготи, тому я використовую число.круток (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 Посібник із стилю рубіну надає перевагу 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вниз, а не вгору, чи є спосіб це виправити?
Дзеркало318

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, перед десятковою
комою

Дякую за точку. Але, запропоновані вами методи теж не вдається!
Анвар

Бо 11111111111111111.222222222222222як вхідний показ, перший показ, 1.11а другий показ1.11111111111111e+16
Анвар

1
Так, ти маєш рацію ... раз 16 місць вперед або над. Випуск переповнення. Найкраще дотримуватися великої десяткової, якщо працювати з великою кількістю. Введення
клавіш

-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 

3
Дякую за відповідь. Чи можете ви, будь ласка, переглянути його англійською мовою, оскільки це питання було задано англійською мовою.
Джаред

Ви шукаєте переклад? Preguntas y respuestas en 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>

Якщо ви хочете скоротити до двох десятків, вам слід скористатися Integr(a*100)*0.01


5
Ніхто не повинен робити це КОГО-небудь під час відтворення відсотків. Це дійсно погана форма, тому що, обрізаючи, ви втрачаєте можливість належним чином ОБЕРЕЖНУВАТИ до найближчих 2 знаків після коми. тобто 0,455, якщо ви просто скорочуєте, ви отримуєте 0,45, що неправильно для округлення, оскільки це повинно призвести до 0,46. Ніколи не обрізайте десяткові місця завжди навколо кругового числа, результат буде неправильним, коли округлення повинно відбуватися.
Гугару
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.