为什么双值55.68743正在转换为55.6874299999?

我有一个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.50400 lat2 = 55.68758,lon2 = 12.50403

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

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

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

要比较两个浮点数,请减去这两个数字,然后检查结果是否低于之前的一致阈值。

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

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

进一步阅读:

  • 机器epsilon(维基百科)

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

System.Decimal