jruby에서 float를 소수점 이하 두 자리로 반올림하는 방법


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.8이 아니라 Ruby 1.9에서 매개 변수를 사용할 수 있습니다. 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자를 지난 경우는 제외하고 주석을 참조하십시오). 문자열 출력을 찾고 있다면 더 나은 솔루션입니다.
Dylan Vander Berg 4

이것이 맞습니다. 나는 6 개 자리에 대한 number.round (6)을 사용 그래서 나는 세대 무작위 위도와 경도이었다
gsumk

199

sprintf('%.2f', number)숫자를 형식화하는 매우 강력하지만 강력한 방법입니다. 결과는 항상 문자열이지만 반올림하기 때문에 어쨌든 프레젠테이션을 위해 수행한다고 가정합니다. sprintf거의 원하는 방식으로 숫자를 지정할 수 있습니다.

전체 스프린트 문서 : http://www.ruby-doc.org/core-2.0.0/Kernel.html#method-i-sprintf


79
'%.2f' % number또한 적어도 내 경험으로는 작품이 더 일반적으로 보입니다.
Michael Kohl

6
@MichaelKohl 루비 스타일 가이드의 호의 sprintf(또는 format오버) %버전. 이에 대한 몇 가지 추론은 여기 에서 논의 되며, 대부분 가독성에 관한 것입니다. 우리 모두가 스타일 가이드를 따라야하는 것은 아닙니다. 단지 몇 가지 이유 만 제시
Lucy Bain

3
소수점 이하 3 자리 이후, sprintf는 5가 아니라 6으로 올림합니다. 예를 들어, sprintf ( "%. 3f", 1.2225)는 "1.222"이고 sprintf ( "%. 3f", 1.2226)는 "1.223입니다. ", 그것이 당신에게 중요하다면, #round
ecoding5

그러나 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

소수점 이하 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

소수점 이하 9보다 큰 정수를 가진 것
rorykoehler

포인트 주셔서 감사합니다. 그러나 제안 된 방법도 큰 숫자로 실패합니다!
Anwar

들면 11111111111111111.222222222222222하나의 입력으로서, 제 방송 1.11과 두번째 방송1.11111111111111e+16
안와르

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 

3
대답 해줘서 고마워. 질문이 영어로 요청되었으므로 영어로 수정하십시오.
Jared

Puedes traducir tu respuesta a inglés? 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>

소수점 이하 2 자리로 자르려면 다음을 사용해야합니다. Integr(a*100)*0.01


5
백분율을 캐스팅 할 때이 작업을 수행해서는 안됩니다. 잘림으로써 가장 가까운 소수점 2 자리까지 올바르게 회전하는 기능을 잃어 버렸기 때문에 이것은 실제로 나쁜 형식입니다. 예를 들어 0.455를 자르면 0.45가되고 반올림에 잘못되어 0.46이됩니다. 항상 숫자를 반올림하여 소수점을 자르지 마십시오. 그렇지 않으면 반올림 할 때 결과가 잘못됩니다.
구 가루
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.