2009-08-18 3 views
1

이 나에게 매우 이상하다 : 끝루비에서 왜 "100.7".to_f.modulo (1) = 0.700000000000003입니까?

irb(main):012:0> "100.7".to_f.modulo(1) 
=> 0.700000000000003 

왜 3?

irb(main):019:0> "10.7".to_f.modulo(1) 
=> 0.699999999999999 

같은 점은 ...이 값의 나머지를 하나만 나눈 값입니다. 정확해야합니다.

+2

거의 모든 [부동 소수점] 질문이 중복됩니다. 예를 들어 http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly-in-binary를 참조하십시오. –

+2

이것은 루비 토크 메일 링리스트에있는 약 100 개의 스레드 또는 실제로 존재해온 프로그래밍 언어의 토론 포럼과도 중복됩니다. –

답변

0

모든 부동 소수점 숫자를 정확하게 표현할 수 없기 때문입니다.

3

이것은 일반적인 부동 소수점 반올림입니다. Float의 고정 된 비트 수에서 모든 10 진수를 간단히 표현할 수 없으므로 일부 값은 가장 가까운 값으로 반올림됩니다.

이 때문에 플로트를 평등하게 비교하지 않는 것이 좋습니다. 보다 작거나 같지만 결코 같지 않은 평등에 대해 비교하십시오.

http://en.wikipedia.org/wiki/Floating_point#Representable_numbers.2C_conversion_and_rounding

간단하게, 그것은 "이 정확해야한다"는 경우는 없습니다. 부동 소수점 소수점을 기대하지 마십시오.

2

에 오신 것을 환영합니다. 표준 부동 소수점 표기법으로 표현할 수없는 숫자가 많이 있으며 비트를 약간 벗어났습니다. 다음과 같이

이 쉽게 설명되어 :

(1..10).collect do |i| 
    v = ((10**i).to_f + 0.7) 
    puts "%13.1f = %.30f" % [ v, v.modulo(1) ] 
end 

결과가 여기서

  10.7 = 0.699999999999999289457264239900 
     100.7 = 0.700000000000002842170943040401 
     1000.7 = 0.700000000000045474735088646412 
     10000.7 = 0.700000000000727595761418342590 
    100000.7 = 0.699999999997089616954326629639 
    1000000.7 = 0.699999999953433871269226074219 
    10000000.7 = 0.699999999254941940307617187500 
    100000000.7 = 0.700000002980232238769531250000 
1000000000.7 = 0.700000047683715820312500000000 
10000000000.7 = 0.700000762939453125000000000000 

공지 소수점 자리 이상으로 정밀도 낮은 숫자 가져 더 큰 것을. 이는 전체 수를 나타낼 수있는 고정 된 양의 정밀도가 있기 때문입니다.