2014-09-27 5 views
0

저는 double의 int 부분과 소수 부분을 얻으려고합니다. 이 내가이 구현 한 방법입니다 : 정수로 소수 부분을 얻을하려고 할 때 나는 FUNC 0.5에 전달to_string 함수가 0을 더합니다.

void func(double d) 
{ 
    int intpart, decpart; 
    intpart = d; 
    string szDec = to_string(d); 
    szDec = szDec.substr(szDec.find(".") + 1); 
    decpart = stoi(szDec); 
    m_iNom = intpart * decpart + 1; 
    m_iDenom = decpart; 
} 

문제가 발생합니다. 대신 5를 얻기의

는 to_String는 SUBSTR() 함수를 사용하는 경우 szDec이 = "0.500000000000000"

하고, szDec는 = "0.500000"

이 나를 떠날 수 decpart = 500000 대신 5

to_String 함수와 substr 함수가 문자열에 0을 추가하고이를 float로 변환하는 것을 어떻게 중지합니까?

+2

그냥 [std :: modf] (http://en.cppreference.com/w/cpp/numeric/math/modf)를 사용하는 것이 무엇이 잘못 되었습니까? – Cubbi

+0

@Cubbi 3.5라고 말하면 3은 5가 아니라 3이 필요합니다. 0.5 –

+1

'3.1'이 있다면 어떨까요? 이 값을 double에 저장하면'3.100000000000000088817841970012523233890533447265625'가됩니다. '3'과'100000000000000088817841970012523233890533447265625' 또는'3'과'1'을 원합니까? 그리고 만약 당신이'3'과'1'을 원한다면, 당신은 그것들을 어떻게 계산하기를 원합니까? – Cubbi

답변

1

귀하의 질문에 대한 답변을 std::to_string으로 지정하는 것은 의도적으로 가능한 단순하게 정의되어 있으며 출력 형식을 변경하기 위해 사용할 수있는 손잡이가 없습니다. 부동 소수점 수의 경우 C의 %f에 해당하는 값을 수행하도록 정의되며이 값은 0.5의 입력에 대해 정확히 "0.50000"을 생성합니다.

boost::lexical_cast<std::string>(d)는 것 std::ostringstream buf; buf << d; szDec = buf.str();, 또는 동등한 C, 당신에게 "0.5"을 줄 것이다,하지만 의견에서 지적했듯이, 만약 당신의 수는 이진 표현할 수없는 무언가 (예 : 자사의 0.1보다는 0.5이있는 경우), 다음 재구성 최적의 소수점 분수는 중요하지 않은 알고리즘입니다.