字符串不等于另一个字符串。为什么?

时间:2011-08-17 17:49:50

标签: ruby-on-rails ruby string hexdump

更具体地说,如何进一步测试?我看到另一个帖子,答案使用了hexdump。我怎么试试这个,我应该吗?

这是我在控制台中的尝试......

变量:myl是我数据库中的纬度值。 ul是api的值。 ll是我重新输入值的地方:

ruby-1.9.2-p180 :106 > myl=a.latitude   #=> "42.3471841"
ruby-1.9.2-p180 :107 > ul=@events[30].xpath('venue')[0]['lat']
=> "42.3471836"
ruby-1.9.2-p180 :108 > myl==ul   #=> false
ruby-1.9.2-p180 :109 > myl==ul.to_i   #=> false
ruby-1.9.2-p180 :110 > myl.to_i==ul.to_i   #=> true
ruby-1.9.2-p180 :111 > Venue.find_by_latitude(ul)   #=> nil
ruby-1.9.2-p180 :112 > Venue.find_by_latitude(ul.to_i)   #=> nil
ruby-1.9.2-p180 :113 > Venue.find_by_latitude(ul.to_s)   #=> nil
ruby-1.9.2-p180 :114 > ul   #=> "42.3471836"
ruby-1.9.2-p180 :115 > myl.class   #=> String
ruby-1.9.2-p180 :116 > ul.class   #=> String
ruby-1.9.2-p180 :117 > ll="42.3471836"   #=> "42.3471836"
ruby-1.9.2-p180 :118 > myl==ll   #=> false
ruby-1.9.2-p180 :119 > ul==ll   #=> true

任何建议都会对您有所帮助!目标是使用纬度和经度来识别已经存储在我的数据库中的地方,因为地点的名称并不总是唯一的。

3 个答案:

答案 0 :(得分:2)

两件事:

据我所知,你把这些东西想象成数字而不是字符串,所以最好在进行比较之前将它们转换成它。

其次,因为弦不是真的相等,但随着纬度的变化而相当接近,我会想出你想要将它们与一些允许的误差范围进行比较。像这样(假设myLatitudeapiLatitude是数字):

(myLatitude - apiLatitude).abs < 0.000001

并且(当你在它的时候)确保你在比较它们时经度约定(-180到180与0到360)是一致的。

答案 1 :(得分:1)

myl = "42.3471841" ul = "42.3471836" ll = "42.3471836"

当然myl不等于ul(它们包含不同的字符串值),但ul和ll相等(它们包含相同的字符串值)。我不明白你的问题是什么?您的代码显示了为什么myl不等于ll

答案 2 :(得分:0)

存储的值可能存在问题,但是完全匹配不起作用。当你处理不同程度的精确度时,这通常会发挥作用。

您可能希望切换到一种约定,其中所有值在保存之前都被强制为特定的精度级别。例如,在保存之前修复它们:

def set_precision
  self.latitude = '%.6f' % self.latitude.to_f
  self.longitude = '%.6f' % self.longitude.to_f
end

这会将"42.72"等值转换为"42.720000",并修剪过于精确的值。

搜索时,只需应用相同的格式。