데이터베이스 엔진에 대한 숫자 형식 변환 함수 집합을 쓰고 있는데 큰 정수 부동 소수점 값을 다음과 같이 변환하는 동작이 걱정됩니다. 더 정밀도가 높은 정수 유형.int -> float -> int 왕복 변환에 반올림 사용
예를 들어 32 비트 정수를 32 비트 단정도 부동 소수점으로 변환합니다. float의 23 비트 유효 부분은 약 7 자리의 정밀도를 산출하므로 약 7 자리 이상의 int를 변환하면 정밀도가 떨어지게됩니다. 당신이 int로 다시 같은 float를 변환 할 때, 당신은 하위 자리에서의 이진 표현의 유물로 끝날 :
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int a = 2147483000;
cout << a << endl;
float f = (float)a;
cout << setprecision(10) << f << endl;
int b = (int)f;
cout << b << endl;
return 0;
}
이 인쇄 :
이2147483000
2147483008
2147483008
후행 008입니다 따라서 float의 정밀도를 넘어서서 int에 유지하는 것이 바람직하지 않은 것처럼 보입니다. 데이터베이스 응용 프로그램에서 사용자는 주로 10 진수 표현에 관심을 갖고 후미에 0은 중요하지 않은 숫자를 나타내는 데 사용됩니다.
제 질문은 다음과 같습니다 : float -> int (또는 double -> long long) 변환에서 십진수 유효 숫자 반올림을 수행하는 잘 알려진 기존 시스템이 있습니까? 그래서?
(참고 : 일부 시스템에는 IEEE 754-2008과 같이 10 진수 부동 소수점 유형이 있지만, 주류 하드웨어 지원이 없으며 C/C++에 내장되어 있지 않습니다. 도로를 지원하려면 직관적으로 이진수를 처리해야합니다.)
이러한 상황은 "왜 왕복 변환이?"묻는 붉은 깃발을 보냅니다 이것은 값이 float가 아닌 정수로 데이터베이스에 저장되어야 함을 의미합니다. 대수 표현을 단순화하는 것과 같습니다. –
좋은 질문입니다. 분명히 왕복 변환을 계획하지 않으며 데이터베이스 엔진 자체에서 이러한 일이 발생하지는 않습니다. 그러나이 데이터베이스는 조밀하게 패킹 된 메모리 내 데이터 용으로 설계되었으므로 가능한 가장 작은 유형을 사용해야합니다.필자는 이진 부동 소수점을 더 높은 정밀도의 int 또는 10 진수 부동 소수점으로 변환 할 때 실제보다 훨씬 더 정밀하다고 생각하는 사용자 (자신의 SQL과 유사한 쿼리를 제출할 수 있음)를 원하지 않습니다. –