Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 具有不同精度的纬度和经度的浮点计算_Ruby_Floating Point_Geocoding_Geokit - Fatal编程技术网

Ruby 具有不同精度的纬度和经度的浮点计算

Ruby 具有不同精度的纬度和经度的浮点计算,ruby,floating-point,geocoding,geokit,Ruby,Floating Point,Geocoding,Geokit,Background:我收到一个long和lat作为web服务的参数。它们通常最多有6位小数。当收到新请求时,我计算最后记录的loc和请求参数中的long/lat之间的距离。如果距离大于相距英里的某个阈值,我将更新当前loc 问题:我使用geokit gem/插件计算LOC之间的距离。很少有错误出现(作者网站上提到的零距离错误-我使用的是1.4.1,它声称错误已修复,但我仍然看到它发生耸耸肩),这导致距离计算在计算两个相同点之间的距离时返回非常不准确的值(如果用户不移动,就会发生这种情况)。这将

Background:我收到一个long和lat作为web服务的参数。它们通常最多有6位小数。当收到新请求时,我计算最后记录的loc和请求参数中的long/lat之间的距离。如果距离大于相距英里的某个阈值,我将更新当前loc

问题:我使用geokit gem/插件计算LOC之间的距离。很少有错误出现(作者网站上提到的零距离错误-我使用的是1.4.1,它声称错误已修复,但我仍然看到它发生耸耸肩),这导致距离计算在计算两个相同点之间的距离时返回非常不准确的值(如果用户不移动,就会发生这种情况)。这将导致不应发生的用户当前loc的更新。你可能想知道,如果只是更新loc,使其成为完全相同的坐标,谁在乎呢?好吧,答案是当loc被更新时,会出现一堆其他的垃圾,这使得它成为一个实际的问题

尝试解决方案:我尝试添加逻辑,在计算距离之前手动检查两个LOC是否相同,然后跳过计算,如果是,则不更新。输入参数为长/lats,精度为6位小数;然而,在我的数据库中,我将值存储为浮点数,它似乎只存储4位小数。这导致我的浮点比较总是失败,并且不适当的loc更新继续发生

好吧,那么实际的问题是:我应该如何进行比较?我是否应该从输入的lat/long中截短2位小数,以某种方式进行四舍五入,使第四位数字正确,然后进行比较?或者,我是否应该进行“在一定范围内”的比较(例如,报告的位置长>当前位置长-.0001和报告的位置长<当前位置长+.0001)?此外,对于现有RubyGem/插件或内置函数的任何建议都将不胜感激

以下是日志的示例输出:

[update_loc] Last location history record at lat: 41.5024, long: -81.6816
[update_loc] Current loc at lat: 41.502467, long: -81.681623
[update_loc] Distance from current loc and last loc history: 5795.10615113555 miles
[update_loc] Locs not identical and distance greater than threshold, inserting new loc history
[update_loc] Location update complete
多谢各位


汤姆

GPS接收器可以给你一个精确到许多小数点的位置,但这并不意味着测量值实际上是那么精确

通常,大约95%的测量值位于几米的圆圈内,这与32位浮点存储的精度大致相同

但是,当您将gps日志绘制为地图上的浮动时,您会清楚地注意到舍入错误

无论如何,要进行比较,我会使用一个范围,而不是将传入值四舍五入并将其与数据库值进行比较。你将无法再检测到最小的动作,但至少你也不会再出现误报


当你使用浮点数来存储东西时,你显然不在乎毫米或厘米。

测试两个数字是否接近的常用方法是使用
abs
,即

 (reported_loc.long - current_loc.long).abs <= tol
(报告位置长-当前位置长)。abs