2009-11-08 7 views
0

에 숫자를 반올림하는 것은 내 코드입니다. 그렇지 않으면 이상한 결과를 낳습니다. 아래는 제가 테스트에 사용 된 번호와 출력 :이 명시 적으로 C에서 7 개 이상의 소수 자릿수 ++ 여기

시험 1 라운드 7 소수점

105.265 

52.5689745694 

25.6835 

452.689785 

12.456789877458 

출력

105.265 

52.5689746 

25.6835 

-214.7483648 

12.4567899 

시험 1 라운드 8 진수 장소

이전과 같은 번호

출력

-21.47483648 

-21.47483648 

-21.47483648 

-21.47483648 

12.45678988 

답변

6

다른 사람들이 말했듯이, int 로의 캐스트는 큰 숫자에서는 작동하지 않습니다. 당신은 수를 대신 floor를 사용하고 유지 고려할 수있는 double에서 반올림한다 :

#include <cstdlib> 
#include <cmath> 

double round(char* strNumber, int decPlace) 
{ 
    double number = std::atof(strNumber); 
    double expo = std::pow(10.0,decPlace); 
    return std::floor(expo * number + 0.5)/expo; 
} 
+0

이 내가 꼭 필요한 것입니다. – Mike55

+0

@Pat : 답변을 "수락"해야합니다. –

1
int temp = (int) (pow(10.0,decPlace) * number + 0.5); 

아마도 32 비트입니다. 그것은 약 2 억을 견딜 수 있습니다. 과다.

1

나에게 보이는 모양은 overflow입니다. pow(10.0,decPlace) * number은 꽤 큰 숫자입니다. 32 비트 정수에 맞추기에는 너무 큽니다 (int은 플랫폼에있을 수 있습니다).

3

intdouble보다 작은 범위를 저장할 수 있습니다; 대부분의 플랫폼에서 최대 값은 약 20 억이며 대부분의 입력 번호에 대해 pow(10.0,8) * number보다 적습니다.

당신은 double로 전화 번호를 유지하고 정수로 내림 할 floor을 사용할 수

double temp = floor(pow(10.0,decPlace) * number + 0.5); 
double result = temp/pow(10.0,decPlace); 
관련 문제