루비에서 반올림 플로트


150

반올림에 문제가 있습니다. 부동 소수점이 있습니다. 소수점을 100으로 반올림하고 싶습니다. 그러나 .round기본적으로 int로 변환하는 것을 사용할 수 있습니다 . 즉, 2.34.round # => 2. 다음과 같은 간단한 효과 방법이 있습니까?2.3465 # => 2.35

답변:


181

표시 할 때 (예를 들어)

>> '%.2f' % 2.3465
=> "2.35"

둥근 모양으로 저장하려면

>> (2.3465*100).round / 100.0
=> 2.35

2
감사. sprintf가 반올림을 처리한다는 사실을 몰랐습니다. sprintf '%.2f', 2.3465작동합니다.
노아 서스 먼

66
value.round (2)가이 솔루션보다 낫습니다
Kit Ho

12
있음을 명심 2.3000.round(2) => 2.3하고 sprintf '%.2f', 2.300 => 2.30. 내 생각에 이것은 round ()의 결함이거나 후행 0을 유지하는 옵션이 있어야합니다.
엑스 칼리버

14
@Excalibur 2.3000.round(2)는 문자열이 아닌 숫자입니다. 숫자 2.3가와 다른 2.30방법은 없으므로 후행 0을 유지하는 옵션이 없습니다. 자신 만의 numbers_with_significance 클래스를 만들 수 있지만 이미 문자열이 있습니다.
Roobie Nuby

6
참고이 있지만 것을 수행 이 소수점에 대한 작업에 결함이있다 '%.3f' % 1.2345(3 소수점이 아닌 2) 그러나! sprintf마찬가지로 동일합니다 . 조심하십시오. 대부분의 예상대로 반환 => 1.234 되지 않습니다 (=> 1.235, 소수점 둘째 자리 이후에 sprintf는 5를 내림 하고 6을 올림합니다). 이것이 바로 위의 Kit Ho의 의견이 25 개 이상의 공감대를 갖는 이유입니다. 사용하기에 안전 '%.3f' % 1.2345.round(3)하므로 먼저 숫자를 올림 한 .round다음 형식을 지정합니다 (필요한 경우 후행 0으로).
likethesky

392

반올림 할 소수점 이하 자릿수를 포함하는 반올림에 인수를 전달하십시오.

>> 2.3465.round
=> 2
>> 2.3465.round(2)
=> 2.35
>> 2.3465.round(3)
=> 2.347

8
이것은 곱하기, 반올림 및 나누기보다 더 합리적입니다. +1
Mark Embling

3
흠이 방법은 루비 1.8.7에없는 것 같습니다. 아마 1.9 일까?
브라이언 암스트롱

2
@ 브라이언. 이것은 확실히 1.9에 있으며 레일에도 있습니다 (이 질문에 태그가 달린)
Steve Weet

3
루비 1.8.7의 round 메소드는이 기능을 가지고 있지 않습니다. 소수점 자리 반올림 파라미터를 추가하는 것은 1.9 능력입니다.
bobmagoo

1
이것으로 후행 0을 얻지 못하므로 1.1.round(2)=> 1.1not1.10
NotAnAmbiTurner

9

이것을 precison으로 반올림하는 데 사용할 수 있습니다 ..

//to_f is for float

salary= 2921.9121
puts salary.to_f.round(2) // to 2 decimal place                   

puts salary.to_f.round() // to 3 decimal place          

7

Float Class에 메소드를 추가 할 수 있습니다.

class Float
    def precision(p)
        # Make sure the precision level is actually an integer and > 0
        raise ArgumentError, "#{p} is an invalid precision level. Valid ranges are integers > 0." unless p.class == Fixnum or p < 0
        # Special case for 0 precision so it returns a Fixnum and thus doesn't have a trailing .0
        return self.round if p == 0
        # Standard case  
        return (self * 10**p).round.to_f / 10**p
    end
end

3

또한 round10, 100 등의 가장 가까운 배수로 반올림 하는 메소드 의 인수로 음수를 제공 할 수도 있습니다 .

# Round to the nearest multiple of 10. 
12.3453.round(-1)       # Output: 10

# Round to the nearest multiple of 100. 
124.3453.round(-2)      # Output: 100



1

그냥 표시해야한다면 number_with_precision 도우미를 사용하십시오 . 당신이 다른 곳이 필요하면 스티브 Weet가 지적했듯이 나는, 사용하는 것입니다 round방법을


1
참고 number_with_precision레일 전용 방법입니다.
Smar

0

루비 1.8.7의 경우 코드에 다음을 추가 할 수 있습니다.

class Float
    alias oldround:round
    def round(precision = nil)
        if precision.nil?
            return self
        else
            return ((self * 10**precision).oldround.to_f) / (10**precision)
        end 
    end 
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.