Typescript 比较两个精度不同的数字

Typescript 比较两个精度不同的数字,typescript,firebase,google-cloud-firestore,Typescript,Firebase,Google Cloud Firestore,我正在使用firebase,我想检索具有特定地址坐标的用户 为此,我使用这种方法 showPopUpInfo(longitude:any, latitude:any){ return this.afs.collection('Utilizador',ref=>ref.where('morada.Coordenadas.latitude', '==', latitude).where('morada.Coordenadas.longitude', '==' , longitude)

我正在使用firebase,我想检索具有特定地址坐标的用户

为此,我使用这种方法

 showPopUpInfo(longitude:any, latitude:any){
    return this.afs.collection('Utilizador',ref=>ref.where('morada.Coordenadas.latitude', '==', latitude).where('morada.Coordenadas.longitude', '==' , longitude)).get()
}
变量纬度和经度的值为:

经度:-8.364

纬度:41.237

我的firebase“Utilizador”文档:

查询的输出为:


我认为找不到用户是因为,尽管纬度和经度的值相同,但纬度和经度的精度不同,但我不知道如何解决这个问题。实际上,文档的纬度和经度值存储为字符串,如此屏幕截图所示。你可以说,因为他们周围有引号。如果将鼠标悬停在该字段上,您还会看到右侧的“(字符串)”

如果您在查询中使用数值,则查询将永远不会匹配此文档,因为FielBASE不认为任何数字等于任何字符串。

如果您的查询实际上使用的是完全相同的字符串,那么您将找到一个匹配项。但通常不建议将数字存储为字符串,因为字符串排序与数字排序不同,因此您将无法对这些数字值正确执行范围查询


一点建议-不要在函数中使用TypeScript类型
any
。要具体,并根据查询要求仅接受
字符串
数字
。如果传递的内容类型错误,这将有助于在代码中引发错误。

实际上,文档的纬度和经度值存储为字符串,如此屏幕截图所示。你可以说,因为他们周围有引号。如果将鼠标悬停在该字段上,您还会看到右侧的“(字符串)”

如果您在查询中使用数值,则查询将永远不会匹配此文档,因为FielBASE不认为任何数字等于任何字符串。

如果您的查询实际上使用的是完全相同的字符串,那么您将找到一个匹配项。但通常不建议将数字存储为字符串,因为字符串排序与数字排序不同,因此您将无法对这些数字值正确执行范围查询


一点建议-不要在函数中使用TypeScript类型
any
。要具体,并根据查询要求仅接受
字符串
数字
。如果传递错误类型的内容,这将有助于在代码中引发错误。

在特定位置查找对象的更典型方法是使用基于范围的地理查询。在足够小的范围内,您可以精确地获得所需的结果。不幸的是,目前Firestore中没有内置这样的地理查询

由于Firestore can查询只能在单个字段上包含范围过滤器,所以不能直接使用该字段进行经度和纬度查询。相反,大多数开发人员使用的解决方案是建立在这个基础之上的,基于。地理哈希将纬度和经度组合成一个单一(字母数字)值,可以根据范围进行过滤

要了解有关在Firestore上运行地理查询的更多信息,我建议观看。当然,也可以看看Firestore上地理查询主题涉及的其他问题:

  • 再来一些

在特定位置查找对象的更典型方法是使用基于范围的地理查询。在足够小的范围内,您可以精确地获得所需的结果。不幸的是,目前Firestore中没有内置这样的地理查询

由于Firestore can查询只能在单个字段上包含范围过滤器,所以不能直接使用该字段进行经度和纬度查询。相反,大多数开发人员使用的解决方案是建立在这个基础之上的,基于。地理哈希将纬度和经度组合成一个单一(字母数字)值,可以根据范围进行过滤

要了解有关在Firestore上运行地理查询的更多信息,我建议观看。当然,也可以看看Firestore上地理查询主题涉及的其他问题:

  • 再来一些

我尝试将值作为数字放入文档中,但仍然不起作用。您可能很难获得两个精确的浮点数。这是一个很难解决的问题,因为IEEE浮点数以非常高的精度表示。事实上,你现在有一个完全不同于你开始时的问题,它应该有自己的问题。如果你真的需要查询精确的GPS坐标(这可能不是一个好主意),你可能根本不需要存储浮点数,而是需要精确精度的整数。因此,如果我理解得很好,你的建议是定义我在数据库中存储坐标时所需的精度,对吗?你不能定义IEEE浮点数的精度,但你可以说一个整数需要多少位数。尝试将lat/lon乘以1000000,删除小数,然后使用精确的整数值进行查询。但是查询精确的lat/lon对非常少见(如何为查询得出这些精确的数字??),我认为你应该考虑弗兰克在关于使用GeHAHASH的范围的另一个回答中所说的。我试着把这些值作为文档中的数字,但仍然不起作用。你可能很难获得两个精确的浮点数。这是一个很难解决的问题,因为IEEE浮点数以非常高的精度表示。事实上,你现在有一个完全不同于你开始时的问题,它应该有自己的问题。如果你真的要查询精确的GPS坐标(哪一个