2014-11-18 11 views
-1

이 문자열을 정확한 숫자 표현으로 변환하는 방법이 필요합니다. 나는 꽤 많은 것들을 시도했고, 내가 아는 바로는 이것이 작동해야한다 (유명한 마지막 단어). 라이브러리를 설치하지 않으려 고 노력하고 있으며 변환 할 숫자가 많습니다.문자열 십진수를 변환 할 때의 정밀도

나는 이진수로 긴 십진수를 표현하는 것이 어렵다는 것을 알고 있지만 해결책이 필요하다.

#include <iostream> 
#include <stdlib.h> 

using namespace std; 

int main() 
{ 
    string data = "138.6470184568"; 
    cout << atof(data.c_str()) << endl; 

    return 0; 
} 

출력

138.647 
+0

를 제공? GCC를 사용하고 있습니까? 라이브러리가 필요없는 Decimal 지원 기능이 내장되어있는 것 같습니다. http://stackoverflow.com/questions/14096026/c-decimal-data-types#comment19516201_14096071 – TessellatingHeckler

+0

값을 정확하게 바이너리로 저장하거나하지 않을 수 있습니다. 십진수로 길이에 의존하지만 이력 분수로 나타낼 수 있는지 없는지. 예를 들어 0.1은 매우 짧지 만 바이너리에서는 정확하게 표현할 수 없지만 0.000244140625는 –

+0

일 수 있으며 **는 atoy와 atof를 사용하지 않습니다. 안전하지 않아. 대신에 오류 검사를 제공하기 때문에 ['strtod'] (http://en.cppreference.com/w/cpp/string/byte/strtof)를 사용하십시오. –

답변

0

는 제대로 변환되지만, 수를 법원을 물었을 때, 그것은 단지 3-4 소수점 이하 자릿수를 제공하는 것이 밝혀졌습니다. 왜 그런지 알아?

#include <iostream> 
#include <stdlib.h> 
#include <iomanip> 

using namespace std; 

int main() 
{ 
    string data1 = "138.6470184568"; 
    string data2 = "138.6470184568"; 
    double data3 = atof(data1.c_str()) + atof(data2.c_str()); 

    cout << data3 << endl; 
    cout << setprecision(15) << data3; 

    return 0; 
} 

은 한 번 변환 그들과 함께 할 무슨 말을하는 건가요

277.294 
277.2940369136 
+0

여기에서 묻는 질문에 대한 답변을 원하시면, 새로운 질문을 만들어 주시겠습니까? –

+0

이 질문에 대한 답변은 무엇입니까? [기본 정밀도는 6 자리입니다.] (http://en.cppreference.com/w/cpp/io/ios_base/precision) 277.294와 138.647은 모두 유효 숫자 6 자리가 있습니다. –

+0

맞습니다.하지만해야 할 일이 있습니다. 더 정밀한 수의 산술 연산. 위의 내 대답은, 그것이 단지 기본적으로 6 자릿수 일 것이지만, 내가 전달한 전체 숫자를 저장하고 (그러므로 산술을 수행하고있다) 증명한다. –