【问题标题】:how to compare complex decimal number with integer value如何将复十进制数与整数值进行比较
【发布时间】:2017-07-10 07:20:45
【问题描述】:

我要找所有靠近我的纬度和经度的诊所。我用以下方法做到了。 dist 的结果是一个长值,我需要将它与整数值进行比较。我不知道为什么在比较距离和距离时会出现这个错误,这是一个整数值。 这是我的错误:

NoMethodError (undefined method `<=' for (-2.693846638591123+0.0i):Complex):

这就是我为此所做的一切:

  def get_clinic_list
     ulat=params[:lat]
     ulang=params[:lang]
     distance=params[:distance]
     @clinic=[]
     Clinic.all.each do |clinic|
       if clinic_distance(ulat,ulang,distance,clinic.id)
         @doctor=DoctorProfile.find_by(user_id: clinic.user_id)
       end
     end
  end
  def clinic_distance(ulat, ulang,distance,clinic)
     @clinic=Clinic.find(clinic)
     diff_lat= ulat.to_f - @clinic.latitude.to_f
     diff_lang= ulang.to_f - @clinic.longitude.to_f
     #disc=Math.sqrt(((diff_lat*119.574)**2)+(diff_lang * Math.cos(diff_lat) * 111.320))
     a=(diff_lat * 119.574) ** 2
     b= diff_lang * Math.cos(diff_lat) * 111.320
     c=a+b
     logger.info "the c parameter is #{c}"

     dist=Math.sqrt(c)

     dist = dist ** 2
     if dist <= distance
         return true
     else
         return false
     end
  end

【问题讨论】:

  • 这是一个公式,它是地球的球状体
  • 我认为红宝石在各种算术上都没有问题
  • 您的clinic_distance 方法完全错误。 119.574 不知从何而来。 b 应该是平方的。您将dist 计算为平方根的平方。你的if 语句没有做任何事情,它只是返回dist &lt;= distance
  • @Stefan: Math.cos 可以返回一个 Complex 数字,如果参数有一个虚部并且 'mathn' 是必需的。 Complex 值可能来自负数 c。不过,它仍然需要“数学”。无论如何,我希望这段代码永远不会投入生产。
  • @EricDuminil 好吧,是的,有点。 mathn replaces MathCMath,所以你实际上调用了 CMath.cos。这是一个 hack,mathn 将从 Ruby 2.5 的 stdlib 中删除。

标签: ruby-on-rails ruby ruby-on-rails-5


【解决方案1】:

复数不支持&lt;=&gt;=(尽管它们支持==

最简单的解决方案是获取数字的绝对部分

if dist.abs <= distance

【讨论】:

  • 我这样做了,但我得到了无法转换为浮点数的错误
  • 事实上我得到了这个错误:RangeError (can't convert -2.693846638591123+0.0i into Float)
  • 好的,嗯,看起来虚部为零,所以我很惊讶。按照我修改后的答案尝试使用“abs”?
  • OP的方法是完全错误的。 .abs 不足以修复它。 :-/
  • 谢谢,@EricDuminil ...。我想回答如何将复数与整数进行比较的具体问题,我的回答可以为将来寻找类似答案的其他人解决这个问题。如果或当 OP 注意到他没有从方法中得到他需要的东西时,他可能会看你的答案,希望如此。
【解决方案2】:

clinic_distance 方法的几乎每一行都有一个错误。我尽力纠正它,但没有你的数据我无法测试它。

问题不在于Complex 数字。我不知道这个Complex 数字来自哪里,可能来自您的Math.sqrt(c) 中的负数c

EarthRadius = 6371 # km
OneDegree = EarthRadius * 2 * Math::PI / 360 # 1° latitude in km

def get_clinic_list
  lat = params[:lat]
  lon = params[:lang] # :lang???
  max_distance = params[:distance] # :distance should probably be :max_distance
  @clinic = [] # What do you do with this empty array?
  Clinic.all.each do |clinic|
    if distance_in_km(lat, lon, clinic.latitude, clinic.longitude) < max_distance
      # Do you really want to keep overriding @doctor every time a clinic is found?
      @doctor = DoctorProfile.find_by(user_id: clinic.user_id)
    end
  end
  # You return every clinic, even ones far away...
end

def distance_in_km(lat1, lon1, lat2, lon2)
  diff_lat = lat1.to_f - lat2.to_f
  diff_lon = lon1.to_f - lon2.to_f

  lat_km = diff_lat * OneDegree
  lon_km = diff_lon * OneDegree * Math.cos(lat1.to_f * Math::PI / 180) # Math.cos expects a radian angle

  Math.sqrt(lat_km**2 + lon_km**2)
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    相关资源
    最近更新 更多