将char [8]转换为double时会出现舍入问题

0 c floating-point

可能重复:
浮点不准确示例

我试图将一个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.所以,任何人都有想法让最后的精度正确或任何其他方式来进行这种转换.您的建议将不胜感激.谢谢

Chr*_*utz 5

问题是所有浮点数都不能用有限的数字表示.浮点类型尽其所能,但在这种情况下,您无法将您的特定数字完全表示为a double.15555555558.111113将是你能做的最好的,除非你求助于任意精度小数的库.