2014-03-25 10 views
0

float 숫자가 7.64 인 경우 inbuilt 함수/라이브러리를 사용하여 WITHOUT 문자열로 변환하십시오. 이 문제는 Java에서 쉽게 나타납니다. + 연산자는 문자열 과부하 같이 먹 float에서 문자열로 변환시 오류가 발생했습니다.

class Float2String 
{ 
    public static void main(String[] args) 
    { 
     float f=7.64f; 
     String result; 
     result=""+f; 
     System.out.println(result); 
    } 
} 

그러나

제가 그렇게하려고으로 C에 .. 할 수

여기
int main() 
{ 
    float f =2.44; 
    int i, j = 0; 
    i = (int) f; 

    f = f - i; 
    while(f > 0) { 
     f *= 10; 
     j = (j*10) + (int) f; 
     f = f - (int) f; 
    } 
    //now make itoa() to convert i and j to strings .  
    return 0; 
} 

문제 부동 소수점 에러 루프 동안 같은 잠입하기 시작한다는 것이다 가는 j는 잘못된 십진수 부분을 남겨 둡니다. 예를 들어 위의 f 값이 다음과 같이 변합니다. 123

c 또는 C++에서이 문제를 해결하는 방법.

+0

염두에 두어야 최소 부동 소수점 값 조금 이상하다. –

+0

다른 해결책을 요구하고 있습니다. @KevinWorkman –

+0

어, 알겠습니다. 내 유일한 요점은 내장 함수를 사용하지 않고 Java에서이 작업을 수행 할 수 있다는 귀하의 진술이 정확하지 않다는 것입니다. –

답변

1

완전히 잘못된 값에 갑자기 점프는 그 int 넘쳐 j에 의해 발생합니다. unsigned long을 사용할 수 있습니다.

Thel 루프는 사실상 0에 도달하지 않지만 부동 소수점 수는 2의 (음수) 합계의 근사치에 불과합니다. 이러한 합계는 10을 곱한 다음 정수 부분.

최선의 방법은 10 N하고 초핑 후미 제로로 곱하는 고정 자릿수를 갖는 것이다.

1

해결책은 float가 지원하는 정밀도 (= 자릿수)로 f를 인쇄하는 것입니다.

int main() 
{ 
    float f =2.44; 
    int i, len; 
    char str[100]; 

    i = (int) f; 
    itoa(i, str, 10); 
    len = strlen(str); 
    str[len] = '.'; 

    f = f - i; 
    while(len <= 6) { 
     len++; 
     f *= 10; 
     str[len] = '0' + (int)f; 
     f = f - (int) f; 
    } 
    str[len + 1] = '\0'; 

    /* Remove trailing zeroes and decimal points. */ 
    for (;len > 0 && (str[len] == '0' || str[len] == '.'); --len) { 
     if (str[len] == '.') { 
      str[len] = '\0'; 
      break; 
     } 
     str[len] = '\0'; 
    } 
    printf("%s", str); 
    return 0; 
} 
+0

len ++는 루프의 맨 위에 있어야합니다. –

+0

문자열 2.440000은 문자열 2.44와 같지 않으므로 여전히 오류가 발생합니다. –

+1

오류를 찾아 주셔서 감사합니다. 답을 수정하고 후행 0을 추가했습니다. –

0

외에도 소수점 수를 지정에서, 다른 방법은 부동 소수점 계좌 부정확성을 고려 소수점 값을 계산하는 단계 float.h 정의 FLT_EPSILON (또는 DBL_EPSILON)를 사용하는 것이다.

FLT_EPSILON

, 그래서 원래 목표 1.0의 차이, 심지어 문자열 + 연산자는 붙박이 기능/라이브러리 (StringBuilder.append)를 사용하고 1.0보다 큰

#include<stdio.h> 
    #include<float.h> 
    int main() 
    { 
     float origf = 2.44; 
     float f = origf, newf = 0.0; 
     int i, j = 0; 
     int powerOfTen = 1; 
     i = (int) f; 
     f = f - i; 
     do 
     { 
      f *= 10; 
      powerOfTen *= 10; 
      j = j * 10 + (int)f; 
      f = f - (int) f; 

      newf = i + (float)j/ powerOfTen; 
     } while ((origf + FLT_EPSILON) > newf && newf > (origf - FLT_EPSILON)); 
     printf("%d %d\n", i, j); 
     return 0; 
    }