2016-12-30 1 views
0

에서 0 값,피 정크 내 아래 프로그램에서 두 변수

main 
{ 
    // value is 476 
    int value = 476; 

    // here dimension shows as 0.100000001 
    float dimension = 0.1f; 



/// Here I am expecting value as 47.6, 
/// But it gives value as 47.600002288818...... 
double result = value * dimension; 
} 

나는 그래서 기대 값을 얻을 수있는 inbuild 기능이 직접 데이터베이스에 값을 저장하려면?

예상 : 47.6 대신 ..... 47.600002288의

+4

왜 이런 일이 일어나는지 궁금 할 때가 있습니다 : [부동 소수점 연산이 깨졌습니까?] (http://stackoverflow.com/q/588004/669576). –

+3

'47.6'값은 어떤 2 ​​진 부동 소수점 유형에도 존재하지 않으므로 근사값 만 얻을 수 있습니다. 데이터베이스 유형이 무엇입니까? – hvd

+0

모든 프로그래머가 부동 소수점 숫자를 메모리에 저장하는 방법에 대해 알아보십시오. – DeiDei

답변

3

몇 가지 방법이 있지만 모든 경우에 부동 소수점 값이 나타내는 정밀도의 자릿수를 결정하고 결정해야합니다. float에 대해 "나는 실제로 0.100000001 대신 .1"이라고 말합니다.

값이 두 자릿수의 정밀도를 가져야한다고 결정한 후에는이를 반올림하는 몇 가지 방법이 있습니다.

#include <sstream> 
#include <iomanip> 

std::ostringstream o; 

    o << std::setiosflags(std::ios::fixed) << std::setprecision(2) << 0.1; 

std::string s=o.str(); 

이제 s에서 "0.10"을 발견 할 것이다 : 하나의 간단한 방법은 스트림 포맷을 사용하는 것입니다.

계산의 결과로 중요한 정밀도의 자릿수를 알 수없는 경우 고정밀 산술 전용 라이브러리 인 like GMP을 사용하는 것이 유일한 옵션입니다.

-1

값이 정밀 47.600002288 저장되지만 당신은 예를 들어, 부동 소수점 한 지 N 숫자를 사용하여 사용하고자 할 때 경우 값 printf 사용 (47.600002288)입니다 :

printf("%.2f\n", result); 

이는 포맷 함수에게 .2% 후에는 부동 소수점 후이 번호를 인쇄 통지, 47.60을 인쇄 할 수 있습니다. 당신이 sprintf을 사용하여 문자열에 직접 인쇄 할 수 있습니다

참고 : 나는이 문자 길이는 아래거나 같아야한다는 것을 의미 sizeof(char)*10 사용 malloc 매개 변수를 알고 있어야이 경우

char s= malloc(sizeof(char)*10); 
sprintf(s, "%.2f\n", result); 
//s contains "47.60" 

9 (마지막 문자는 문자열 끝 문자 \0에 예약되어 있기 때문입니다).

0

부동 소수점은 실제로는 2 진수 (2 진수)로 표현 된 가수입니다. 이 결과로 0.1 십진수 (일명 분수 1/10)는 부동 소수점으로 정확하게 표현 될 수 없습니다.

이유는 정확히 1/3을 고정 소수점 이하 자릿수로 표시 할 수 없습니다. 이는 무한 반복되는 값인 0.3333333.....이며, 제한된 수의 곳으로자를 경우 오류가 발생합니다. 유일한 차이점은 1/10이 기본 2에서 무한히 반복되는 값이라는 것입니다. 따라서 한정된 수의 2 진수로 정확히 표현 될 수 없습니다.

이러한 방식으로 영향을받는 다른 값 (예 : 0.2, 0.6 등)이 분명히 있습니다. 이러한 오류는 부동 소수점 표현의 고유 한 특성입니다. 또는 다른 말로 표현하면 부동 소수점은 근사값 (정밀도가 잠재적으로 부족한 값)을 나타냅니다. 그리고 일련의 계산을 수행 할 때 값의 오류가 전파됩니다.

0.1을 부동 소수점 (및 다른 값)으로 정확하게 표현할 수있는 방법이 없기 때문에 정확하게 부동 소수점 값을 데이터베이스에 저장하고 정확하게 0.1 값을 얻는 방법은 없습니다.

당신은

#include <sstream> 
#include <iomanip> 
#include <string> 

std::ostringstream o; 

o << std::fixed << std::setprecision(2) << result; 

std::string s=o.str(); 

로, 출력의 정밀도를 제한하는 방법으로 값을 인쇄 시도 할 수 곰을 염두에 포맷하는 방법을 result 제어 (예를 들어,이 경우에 문자열 출력에). result의 값은 변경되지 않습니다.

개념적으로 필드가 숫자가 아닌 문자열을 나타내는 경우 s 문자열을 데이터베이스에 저장할 수 있습니다.