如何在Jruby中将浮点数舍入到两位小数


172

JRuby1.6.x。如何在jruby中将浮点数舍入到小数位。

number = 1.1164
number.round(2)

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

如何将其四舍五入到小数点后两位?

Answers:


87

Float#round可以在Ruby 1.9中接受参数,而不是在Ruby 1.8中。JRuby的默认值为1.8,但可以在1.9模式下运行


1
我知道Sam似乎不打算将数字四舍五入以表示类似货币的东西,但是请注意,如果您尝试使用#round(precision)则无法按预期工作(3 .round(2)#=> 3.0,而不是3.00)。为此,请在下面查看Theo的答案。
jaredsmith

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

12
(5.6).round(2)仅返回5.6
Bala Karthik

3
似乎合理,额外的零占位符仍然存在,只是不可见
boulder_ruby

@BalaKarthik这就是我使用Theo解决方案的原因。它可以正确舍入(除非您出于某种奇怪的原因要超过3个小数,请参见注释),因此,如果要查找字符串输出,这是更好的解决方案。
迪伦·范德伯格

这是对的。我正在生成随机的经度和纬度,因此我使用
number.round

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 '16

但是0.566666666666666四舍五入0.57
Anwar

"%.2f"几轮5下来,而不是了,有没有什么办法解决呢?
Mirror318

3

编辑

得到反馈后,原始解决方案似乎无效。这就是为什么将答案更新为建议之一的原因。

def float_of_2_decimal(float_n) 
  float_n.to_d.round(2, :truncate).to_f
end

如果您想将小数点后两位取整,则其他答案也可能有效。但是,如果您希望浮点数的前两位小数不取整,那么这些答案将无济于事。

因此,为了获得前两位小数的浮点数,我使用了此技术。在某些情况下不起作用

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 2016年

小数点后第一个整数大于9的东西
rorykoehler '16

谢谢你的意思。但是,您建议的方法也会大量失败!
安瓦尔

对于11111111111111111.222222222222222输入,第一场演出1.11和第二场演出1.11111111111111e+16
Anwar

1
是的,您是对的。。。一旦位于前面或上方的位置为16。溢出问题。如果要处理大量数字,最好坚持使用大十进制。类型转换带来了问题
rorykoehler 2016年

-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
谢谢回答。您可以将其修改为英文,因为问题是用英文提出的。
贾里德(Jared)2016年

Puedes traducir tu respuesta ainglés?PreguntasŸrespuestas西班牙文德夯existir
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
铸造百分比时,任何人都不要这样做。这是一种非常糟糕的形式,因为通过截断您会失去正确舍入到小数点后两位的能力。即0.455如果您只是截断,则会得到0.45,这对于四舍五入是错误的,因为它应得到0.46。永远不要截断小数,始终将数字四舍五入,否则在出现四舍五入时结果将是错误的。
古古鲁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.