为什么双精度值55.68743会转换为55.6874299999

本文关键字:转换 6874299999 68743 双精度 为什么 | 更新日期: 2023-09-27 18:06:41

我有一个wcf方法,我必须计算到经纬度点之间的距离。距离计算器方法接受double值作为参数。因此,当我发送纬度值=55.68743时,.net将其转换为55.6874299999我弄错了距离

为什么值在转换??有人知道怎么解吗?

下面是一些代码…

public double distance(double lat1, double lon1, double lat2, double lon2)
    {
        double theta = lon1 - lon2;
        double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta));
        dist = Math.Acos(dist);
        dist = rad2deg(dist);
        dist = dist * 60 * 1.1515;
        dist = dist * 1.609344;
        return (dist);
    }
    public double deg2rad(double deg)
    {
        return (deg * Math.PI / 180.0);
    }
    public double rad2deg(double rad)
    {
        return (rad / Math.PI * 180.0);
    }

在上面的代码中,我正在计算两点的距离。lat1 = 55.68743, lon1 = 12.50400lat2 = 55.68758, lon2 = 12.50403

执行时,lat1的值变为55.687429999999999,lon1变为12.504。

为什么双精度值55.68743会转换为55.6874299999

这主要是因为计算机是二进制的,而你对数学的传统理解是十进制的。

本质上,计算机没有办法精确地用二进制浮点格式表示55.68743,因此使用最接近的值55.6874299999

要比较两个浮点数,您需要减去两个数并检查结果是否低于先前商定的阈值。

double actual = 55.6874299999;
double expected = 55.68743;
if (Math.Abs(actual- expected) < 0.00001) 
{
    // do something
}

(最常用的)浮点运算的语义已经在IEEE 754

中正式定义。

进一步阅读:

  • Machine epsilon (Wikipedia)

尝试使用十进制结构而不是浮点类型。系统。Decimal不像典型浮点值那样存储不精确的信息。不幸的是,它们也占用了两倍的空间,但如果你需要精度,你会得到它。

系统。十进制