2012-11-07 2 views
0

가능한 중복 :
Floating point error in representation?합계 플로트 번호 C++

이 코드

int cent; 
int dollar ; 
float cnt2dlr; 
//convert cnt to doloar ; 
cnt2dlr=(cnt)/(100); 

에 문제가있는 문제는 때 cnt = 175, cnt2dlr = 0.17,444444하지 0.17,5

입니다

도움이 필요하십니까?

+5

당신의 별명은 재미 있습니다 :) –

+0

나는 그것을별로 이상하게 생각합니다. – CookieOfFortune

+1

[긴 대답] (http://docs.oracle.com/cd/E19957- 01/806-3568/ncg_goldberg.html) –

답변

1

부동 소수점 숫자는 정확한 표현이 아닙니다. 그것들은 근사치이므로 많은 정밀도를 보장 할 수는 없습니다. 읽기 What Every Computer Scientist Should Know About Floating-Point Arithmetic

숫자의 정밀도를 높이려면 32 비트 float 대신 64 비트 double을 사용하는 것이 좋습니다.

+0

yoou 감사합니다. –

7

부동 소수점 숫자는 종종 부정확합니다. 그것에 대해 할 수있는 일이 없습니다.

귀하의 코드는 돈과 관련된 계산에 부동 소수점 숫자를 사용하지 않아야하는 이유에 대한 좋은 예입니다. 통화 값에 소수점이 있기 때문에 이 아닌은 부동 소수점 수량을 만듭니다. 부동 소수점은 온도 나 속도와 같이 극단적으로 변화하는 양에 사용되어야하며, 돈과 같이 덩어리가 다른 양에는 사용되지 않아야합니다.

+0

에 가까워 야합니다. 그러나 32 비트 부동 소수점은 여전히 ​​정밀도가 더 높습니다. – CookieOfFortune

+0

@CookieOfFortune 매우 사실이지만 게시 된 실제 코드가 아니기 때문에 누가 말할 수 있습니다. 그리고 그가 센트를 1000 달러로 나누어 달러로 전환한다면 그의 프로그램에는 다른 문제가 있습니다. – john

+0

당신과 의견이 다르지 않지만 32 비트 부동 소수점을위한 24 비트 정밀도는 숫자가 정말 가까이 있어야 함을 의미합니다. 2936013/2^24 = 0.17500001192 – CookieOfFortune

1

나는 약간 의아해합니다. 대신 (CNT)의 (퍼센트)을 의미하는 경우,

cnt2dlr=(cent)/(1000); 

(센트에서 전자를 주)의 int/INT 부문, 그리고/1000 175 0

INT 당신이받을 수 있나요 반환해야 같은 결과가 나오면 예를 들어

cnt2dlr=(cent)/(1000.0); 

소수점에 유의하십시오.