2011-10-07 6 views
1

double 값을 string 값으로 변환해야하는 함수가 있습니다.소수점 값 얻기

inline static string StringFromNumber(double val) // suppose val = 34.5678 
{ 
long integer = (long)val; // integer = 34 
long pointPart; // should be = 5678 how do I get it? 
} 

integerpointPart 모두에 대해 long 값을 얻으려면 어떻게해야합니까?

추가 : 0을 버리고 17 개의 숫자로 된 정밀도를 원합니다. 더 많은 예제 :

val = 3.14 정수 = 3 pointPart = 14

val = 134.4566425814748 정수 = 134 pointPart = 4566425814748

지금까지 아무런 해결책이 없습니다. 그것을 어떻게 얻을 수 있습니까?

+0

'pointpart = (val - 정수) * decimalplacesyouneed'? 오, 길다는 것을 알 수 있습니다. 소수점 몇 자리를 원하십니까? – RedX

+1

34.567 및 34.56789에 대한 pointPart는 무엇이되어야합니까? 또한 val ≥ LONG_MAX + 1이면 어떻게 될까요? –

+1

당신의보기와 질문은 가짜입니다. 34.5678은 정확하게 이중으로 표현할 수 없습니다. 여기를 확인하십시오 : http://pages.cs.wisc.edu/~rkennedy/exact-float?number=34.5678 567799999999998606011794792115688323974609375 대답으로보고 싶지 않다고 가정합니다. –

답변

1

modf을 사용하여 정수와 소수 부분을 구분할 수 있습니다. 그런 다음 분수 부분을 1.0e17으로 곱하고 floor을 호출하여 결과를 정수 구성 요소로 올바르게 반올림 한 다음 unsigned long으로 캐스트 할 수 있습니다 (소수 부분은 절대로 음수가 아니므로 해당 부분의 비트 수를 최대화 할 수 있음). 정수형). 마지막으로 루프를 실행하여 unsigned long의 0을 잘라냅니다. 64 비트 플랫폼에 있으며 unsigned long는 64 비트 정수 타입으로 정의 된 경우이 코드는 17 소수점 이하 자릿수까지 작동합니다

inline static string StringFromNumber(double val) 
{ 
    double intpart, fracpart; 
    fracpart = round((modf(val, &intpart)) * 1.0e17); 

    long int_long = static_cast<long>(intpart); 
    unsigned long frac_long = static_cast<long>(fracpart); 

    //trim off the zeros 
    for(unsigned long divisor = 10;;divisor *= 10) 
    { 
     if ((frac_long/divisor) * divisor != frac_long) 
     { 
      frac_long = frac_long/(divisor/10); 
      break; 
     } 
    } 

    //...more code for converting to string 
} 

참고 : 예를 들어. 그렇지 않으면 unsigned longuint64_t으로 변경해야합니다. 또한 부동 소수점 숫자는 근사값이므로 승수는 1.0e17이고 fracpart 값은 정확하게 val의 포인트 부분 값이 아닐 수 있습니다. 즉, 다음에 숫자가 추가 될 수 있습니다. 필요한 반올림.

+0

작동하지 않습니다. –

+0

죄송합니다. 방금 수정 된 구문 관련 입력 오류가있었습니다. 그 외에는 어떤 결과를 찾고 있었습니까? 예를 들어,'3.15247428'을 건네 준 경우 정수 부분은'3'을 얻고 분수 부분은'15247428'이됩니다. 결과는 다음에서 볼 수 있습니다 : http://codepad.org/FPAQkWhq ... 그 코드가 32 비트 플랫폼에서 실행되고 있기 때문에, 4.2e9 이상의 모든 것이 'unsigned long' 타입을 오버플로합니다. – Jason

2
long pointPart = static_cast<long>(val*10)%10; 

10 ... 3 등을위한 100 ...

String realPoint = (string)pointPart; 

플러스 긴 connot 17 자리 숫자를 누르고 있습니다. 그것은 보유하고 있습니다. float 변수를 원할 것입니다

+1

+1하지만 저에게 묻는다면'static_cast'의 스타일 남용입니다.'long (val * N) % N'은 잘 할 것입니다. – spraff

+0

@spartan 매우 좋지만, 불행히도 0을 버리지 않습니다 –

+0

discard zero? 예와 왜? 이 방법에 따라 – SD1990

3

stringstream은 특히 소수점을 가져 오지 않지만 전체 숫자를 문자열로 변환합니다.

std::stringstream ss; 
ss << val; 
/*access the newly-created string with str()*/ 
return ss.str();