关于float丢失精度

关于float丢失精度

在实际中遇到一个问题:
当float类型的一个数的整数部分特别大时,如4399670.00在计算时,这个数只保留两位小数,此时,这个数参加运算时,就会丢失小数级别的精度。0.15,0.25会被当做0.00。这是因为整数部分太长,float只占4个字节所造成的。此时,把计算相关的类型换成double即可。

代码:

    float X = 0;
    double Y = 0;
    float Z = 0;
    const float x_Dem = highResoluationDem.adfGeoTransform[0];
    const double y_Dem = highResoluationDem.adfGeoTransform[3];
    const float dx_Dem = highResoluationDem.adfGeoTransform[1];
    const float dy_Dem = highResoluationDem.adfGeoTransform[5];
    const int ncols_Dem = highResoluationDem.ncols;
    for (int i = 0; i < row; i++)
        for (int j = 0; j < col; j++) {
            X = x_Dem + j * dx_Dem + 0.5f * dx_Dem;
            /////////重点//////////////
            Y = y_Dem + i * dy_Dem + 0.5f * dy_Dem;
            Z = highResoluationDem.demdata[i * ncols_Dem + j];
            if (Z != (float)_noneData) {
                if (indexMap.demdata[i * ncols_Dem + j] == imageID)
                {
                    float x = 0;
                    float y = 0;
                    //getxy(X, Y, Z, x, y, image);
                    float f = image.f;
                    const Rotation_Mat &m = image.m;
                    float Xs = image.Xs;
                    float Ys = image.Ys;
                    float Zs = image.Zs;

                    x = -f * (m.a1 * (X - Xs) + m.b1 * (Y - Ys) + m.c1 * (Z - Zs)) / (m.a3 * (X - Xs) + m.b3 * (Y - Ys) + m.c3 * (Z - Zs));
                    y = -f * (m.a2 * (X - Xs) + m.b2 * (Y - Ys) + m.c2 * (Z - Zs)) / (m.a3 * (X - Xs) + m.b3 * (Y - Ys) + m.c3 * (Z - Zs));

                    DT_8U value[3];
                    //image.get_PixelValueFormxy(x, y, value);

                    int _row = 0;
                    int _col = 0;
                    _row = -y + 0.5 * image.row;
                    _col = x + 0.5 * image.col;

float y_Dem = 4399670.00, double y_Dem = 4399670.00000000
只需将y_Dem和Y换成double即可,其他变量不需要变。

另外,在使用小数时,尽量使用浮点型,因为double占8字节,但默认情况下都是double型。
如:
//由于a有类型,所以后面的数无所谓
int a = 5;
float b = 0.5;
//但a是整型,0.5默认是double型,所以是0.5占了8个字节的空间。
float c = a*0.5;
//这样写最好
float c = a*0.5f;

猜你喜欢

转载自blog.csdn.net/fb_help/article/details/81291689