가능한 중복 :
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
도움이 필요하십니까?
가능한 중복 :
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
도움이 필요하십니까?
부동 소수점 숫자는 정확한 표현이 아닙니다. 그것들은 근사치이므로 많은 정밀도를 보장 할 수는 없습니다. 읽기 What Every Computer Scientist Should Know About Floating-Point Arithmetic
숫자의 정밀도를 높이려면 32 비트 float
대신 64 비트 double
을 사용하는 것이 좋습니다.
yoou 감사합니다. –
부동 소수점 숫자는 종종 부정확합니다. 그것에 대해 할 수있는 일이 없습니다.
귀하의 코드는 돈과 관련된 계산에 부동 소수점 숫자를 사용하지 않아야하는 이유에 대한 좋은 예입니다. 통화 값에 소수점이 있기 때문에 이 아닌은 부동 소수점 수량을 만듭니다. 부동 소수점은 온도 나 속도와 같이 극단적으로 변화하는 양에 사용되어야하며, 돈과 같이 덩어리가 다른 양에는 사용되지 않아야합니다.
에 가까워 야합니다. 그러나 32 비트 부동 소수점은 여전히 정밀도가 더 높습니다. – CookieOfFortune
@CookieOfFortune 매우 사실이지만 게시 된 실제 코드가 아니기 때문에 누가 말할 수 있습니다. 그리고 그가 센트를 1000 달러로 나누어 달러로 전환한다면 그의 프로그램에는 다른 문제가 있습니다. – john
당신과 의견이 다르지 않지만 32 비트 부동 소수점을위한 24 비트 정밀도는 숫자가 정말 가까이 있어야 함을 의미합니다. 2936013/2^24 = 0.17500001192 – CookieOfFortune
나는 약간 의아해합니다. 대신 (CNT)의 (퍼센트)을 의미하는 경우,
cnt2dlr=(cent)/(1000);
(센트에서 전자를 주)의 int/INT 부문, 그리고/1000 175 0
INT 당신이받을 수 있나요 반환해야 같은 결과가 나오면 예를 들어
cnt2dlr=(cent)/(1000.0);
소수점에 유의하십시오.
당신의 별명은 재미 있습니다 :) –
나는 그것을별로 이상하게 생각합니다. – CookieOfFortune
[긴 대답] (http://docs.oracle.com/cd/E19957- 01/806-3568/ncg_goldberg.html) –