2013-03-09 2 views
1

다음 함수는 문자열을 double로 변환하지만 정밀도가 충분하지 않습니다.C++에서 문자열을 두 번 변환

double stringToDouble(string s) { 
    double d; 
    stringstream ss(s); //turn the string into a stream 
    ss >> d; //convert 
    return d; 
} 

stringToDouble ("31.2458782523")과 함께 호출하면 출력은 31.2459입니다.

Boost 라이브러리를 사용하지 않으면 더 나은 방법이 있습니까? 나는 높은 정밀도를 원한다. 가능한 한 높이.

+1

결과가 정확하지 않은 경우가 아니라 출력 정밀도를 적절히 설정했기 때문에 결과가 그대로 출력됩니다. 이 점에 관해서는 몇 가지 질문이 있습니다. – us2012

+0

@BenjaminLindley 질문에 OP는 '산출물'이 31.2459이고, 더 높은 정밀도를 원하기 때문에 불행하다고 OP는 불만스러워합니다. 대답은 현재의 메서드가 결과 double을 올바르게 인쇄하는 경우 원하는 모든 정밀도를 제공한다는 것입니다. 그래서 나는 그것이 도움이된다고 생각하는 경향이 있습니다. – us2012

+0

@ us2012 : 네 말이 맞아, 내 실수 야. –

답변

3

double은 올바르게 구문 분석되지만 잘못된 정확도로 표시 될 가능성이 큽니다. 어떻게 출력합니까? 귀하의 필요에 맞게 정밀도를 조정하면 괜찮습니다.

또한 부동 소수점 숫자는 항상 메모리에 정확하게 표시 될 수 없으므로 float 또는 double을 사용할 때 (작은) 반올림 오류가 발생할 수 있습니다. 그러나 당신은 달에 로켓을 보낼 계획이 아니라면 보통 무시할 수 있습니다.

+0

감사합니다. 따라서 SO로 작업하는 대신,이 숫자에 대해 여러 수학적 계산을 수행하면 정확도 수준 (작은 반올림 오류 무시)이 계속 유지됩니다. 계산을 수행하는 동안 정밀도를 설정하는 것에 대해 걱정해야합니까? – Pranjal

+0

@ user1549727 아니요. 'double'로 작업하는 한 산술 연산은 'double'정밀도로 수행됩니다. 중간 단계에서 복식을 실수 또는 정수로 변환하지 않도록주의하십시오. – us2012

+0

차가움. 말이된다. 다시 한 번 감사드립니다.이 커뮤니티를 좋아하십시오. – Pranjal

2

C++ 11을 사용하는 경우 std::stod을 사용할 수 있습니다. 트링

STODS = D- ouble

double myDouble = std::stod(myString); 

이 비교적 알맞은 정확성을 제공해야한다.

더 높은 정밀도가 필요한 경우에는 long double 값으로 std :: stold를 사용할 수 있습니다.

관련 문제