2011-02-07 3 views
1

Float의 truncate 메소드는 float를 정수로 자릅니다. 여기에 무슨 일이 일어나고 있습니까 :Ruby float truncate에 혼란 스럽습니다

>> 14820.truncate 
=> 14820 
>> (148.2 * 100) 
=> 14820.0 
>> 14820.0.truncate 
=> 14820 
>> (148.2 * 100).truncate 
=> 14819 

왜 마지막 계산 출력 14820도 표시되지 않습니까?

답변

5

부동 소수점 반올림 오류로 truncate과 관련이 없습니다. 예 : 이것을 시도하십시오

(148.2 * 100) < 14820 

true을 반환합니다. 비유하자면, 148.2 대신 148.2 대신 148.199999999을 얻을 수 있습니다. 정확히을 부동 소수점 숫자로 나타낼 수 없기 때문입니다.

3

148.2 * 100의 결과는 정확히 14820이 아니지만 부동 소수점 오류로 인해 그 값보다 약간 작습니다. 당신이 가진 가치를 볼 수 있습니다

14819.에 따라서, 절단 것 :

>sprintf("%.19f", 148.2*100) 
=> "14819.9999999999981810106" 
0

으로이 오류를 반올림 부동 소수점 인 위 말했다. Ruby에는 이러한 단점이없는 합리적인 분수를 나타낼 수있는 클래스 Rational이 추가되어 있으므로 사용하고 싶을 수도 있습니다.

0

잘라 버리는 대신 반올림을 고려해 보셨습니까?

관련 문제