2014-05-24 7 views
1

저는 VS 2012로 놀고 있었고 (적어도 저에게는) 매우 까다로운 문제를 보았습니다. 명령 행에서 입력에 수학 연산을하는 간단한 프로그램이 있습니다. 그러나 프로그램에 소수점과 함께 인수를 입력하면 소수점 이하의 숫자를 잊어 버릴 것입니다.C에서 char에서 int로 소수점 이하 자릿수로 변환

test 52.2 44.6 

반환하는 대신 96.8의 96

double result = add(argv[1], argv[2]); 
printf("%f \n", result); 

및 명령 줄에서 호출

double add (char const *inp, char const *inp2) {  //addition function 
    double val = std::strtol(inp, NULL, 0); 
    double val2 = std::strtol(inp2, NULL, 0); 
    return val + val2; 
} 

다음 함수를 호출.

+0

@rici는 더 나은 방법을 아마이 :이 답변으로 게시되어야한다, 코멘트가 아닙니다. –

+0

@rici 오 예, strtod는 아마도 복식에 더 좋습니다! 감사합니다 –

+0

@RemyLebeau : 그래, 네가 맞을 것 같아. 나는 게으르다. – rici

답변

1

strtod이 아니라 strtol이 필요합니다. strtol은 정수만 분석합니다. 부동 소수점 숫자가베이스 (10)에 항상 있기 때문에

strtod 만 (지금까지 strtod에 관한 한, 어쨌든.), 2 개 개의 인수를 취하는

+0

죄송합니다. 내가 지울거야. –

0

난 당신이 (내가 그 무엇을 추측하고있어 걷고로 문자열을 돌리고있다 생각 strtol()은 ...). 나는 계산기를 구축하고 있었고, 난 그 문제를 가지고 있었다 - 내가 헨델하는 함수를 썼다 :

double string_to_double(string str) 
{ 
    int length = (int)str.length(); 
    double output = 0; //This holds value of output. Will be added for each 10's digit 
    int decimalPos = length - 1; 
    for (int i = 0; i < length; i++) 
    { 
     if(str.at(i) == '.') // Find if there is a decimal point 
     { 
      decimalPos = i - 1; //Sets Decimal Position 
      str.erase(str.begin()+i); 
      length--; 
     } 
    } 



    for (int i = 0; i < length; i++) 
    { 
     switch (str.at(i)) 
     { 
      case '1': 
       output += 1*pow(10, decimalPos - i); 
       break; 
      case '2': 
       output += 2*pow(10, decimalPos - i); 
       break; 
      case '3': 
       output += 3*pow(10, decimalPos - i); 
       break; 
      case '4': 
       output += 4*pow(10, decimalPos - i); 
       break; 
      case '5': 
       output += 5*pow(10, decimalPos - i); 
       break; 
      case '6': 
       output += 6*pow(10, decimalPos - i); 
       break; 
      case '7': 
       output += 7*pow(10, decimalPos - i); 
       break; 
      case '8': 
       output += 8*pow(10, decimalPos - i); 
       break; 
      case '9': 
       output += 9*pow(10, decimalPos - i); 
       break; 
      case '0': 
       break; 
     } 

    } 
    return output; 
} 

...하지만

+0

그래, Jeffery 's는 더 좋은 방법이다 :) –

+0

그것은 흥미로운 문제이다. 하지만 'strtod'방법을 사용합니다. –

+0

라이브러리 기능이 무엇인지 이해하는 것이 좋지만 일반적으로 더 잘 수행 할 수 있습니다. 예를 들어,'strtod'는 정확성 요구 사항을 만족시키기 위해 계산 오류를 최소화하기 위해 열심히 노력합니다. 결과는 세 개의 가장 가까운 표현 가능한 값 중 하나 여야합니다. 그렇게하기가 어렵고 순진한 구현은 거의 이루어지지 않을 것입니다. – rici

관련 문제