可能重复:
浮点不准确示例
我试图将一个char数组转换为double,但我得到了一些小数的最后一个精度的舍入.请参阅下面的代码.
#include <stdio.h>
#define INT32MAX 017777777777
#define LIND 0
#define MIND 1
typedef int Int32;
typedef unsigned int UInt32;
typedef short int Int16;
union _talign
{
double _doubles[2];
double _double;
Int32 _long[4];
UInt32 _unsign[4];
Int16 _short[8];
float _float[4];
char _char[16];
long long _BIGINT;
};
int main()
{
union _talign value;
double dval = 0.0;
double dmag = 1000000.0000000000;
int i=0;
char cp[8] = { 135,55,83,03,178,67,55,0};
for(i=0;i<8;i++)
value._char[i] = cp[i];
dval = (double)value._long[MIND];
dval = ((double)INT32MAX + 1.0) * dval * 2.0;
dval = (dval + value._long[LIND]) / dmag ;
printf("Expecting dval = 15555555558.111111\n");
printf("Got dval = %lf\n",dval);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我期待dval为15555555558.111111,但程序返回15555555558.111113.所以,任何人都有想法让最后的精度正确或任何其他方式来进行这种转换.您的建议将不胜感激.谢谢
问题是所有浮点数都不能用有限的数字表示.浮点类型尽其所能,但在这种情况下,您无法将您的特定数字完全表示为a double.15555555558.111113将是你能做的最好的,除非你求助于任意精度小数的库.