C# 为什么双精度值55.68743转换为55.6874299999?

C# 为什么双精度值55.68743转换为55.6874299999?,c#,.net,wcf,C#,.net,Wcf,我有一个wcf方法,我必须计算从纬度到经度点的距离。 距离计算器方法采用双值作为参数。 所以当我发送纬度值=55.68743时,.net将其转换为55.6874299999 我走错了距离 为什么值正在转换??有人知道我怎么解决吗 这里有一些代码 public double distance(double lat1, double lon1, double lat2, double lon2) { double theta = lon1 - lon2; do

我有一个wcf方法,我必须计算从纬度到经度点的距离。 距离计算器方法采用双值作为参数。 所以当我发送纬度值=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.50400 lat2=55.68758,lon2=12.50403


当我执行时,lat1的值变为55.6874299999999,lon1变为12.504。

这基本上是因为计算机是二进制的,而你对数学的传统理解是十进制的

本质上,计算机无法准确地以二进制浮点格式表达
55.68743
,因此使用最接近的可能值
55.6874299999

要比较两个浮点数,将两个数相减,然后检查结果是否低于先前的聚集阈值

double actual = 55.6874299999;
double expected = 55.68743;
if (Math.Abs(actual- expected) < 0.00001) 
{
    // do something
}
double-actual=55.6874299999;
双预期=55.68743;
if(数学绝对值(实际-预期)<0.00001)
{
//做点什么
}
浮点运算的(最常用的)语义已在中形式化

进一步阅读:


尝试使用十进制结构,而不是浮点类型。System.Decimal存储的信息与典型浮点值的不精确性不同。不幸的是,它们也占用了两倍的空间,但是如果你需要精确性,你就会得到它


您可能需要读取浮点数-。double是一个浮点数。读一读请发一些代码。。如何发送纬度值?得到它的方法是如何精确定义的?我肯定你有浮点数而不是双精度。正如前面提到的,这一切都与计算机存储数字的方式有关,不幸的是,在存储浮点数和双精度到你想要的精度方面有困难。PS我认为这个问题不应该被降级。“不可能”有点夸张。如果需要,55.68743的每个数字也可以保存为整数或字节值,@RolandK感谢您的提示。我更新了我的答案,现在声明没有办法用浮动二进制格式来表达这一点。