Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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
Java 带long和lat的BigDecimal问题_Java_Groovy_Latitude Longitude_Bigdecimal - Fatal编程技术网

Java 带long和lat的BigDecimal问题

Java 带long和lat的BigDecimal问题,java,groovy,latitude-longitude,bigdecimal,Java,Groovy,Latitude Longitude,Bigdecimal,我有一个地址域,它的字段是lat和long,与BigDecimal一样长,我使用的比例约束是16。我有这个地址 550 Tremont St, Boston, MA 02116, USA 其长度和纬度分别为-71.07126540000002和42.3438919 此地址的经度存储在db中,为-71.0712654000000200。现在我需要将保存的经度与任何新请求进行比较,以检查经度是否已经存在 我再次发送相同的经度-71.07126540000002,但我无法将其转换为保存在db中的形式

我有一个地址域,它的字段是lat和long,与BigDecimal一样长,我使用的比例约束是16。我有这个地址

550 Tremont St, Boston, MA 02116, USA
其长度和纬度分别为-71.07126540000002和42.3438919

此地址的经度存储在db中,为-71.0712654000000200。现在我需要将保存的经度与任何新请求进行比较,以检查经度是否已经存在

我再次发送相同的经度-71.07126540000002,但我无法将其转换为保存在db中的形式(-71.0712654000000200),因为它们是长的。地址相同

我试着用

BigDecimal a = new BigDecimal(-71.07126540000002)
println a.setScale(16,  RoundingMode.CEILING)​ // tried all other RoundingMode
但所有人的回答都是-71.0712654000000156或-71.0712654000000157,但没有得到-71.0712654000000200

救命啊

应该使用它

a.setScale(14, RoundingMode.HALF_UP)
因为在第14位之后,零没有意义


最后将是-71.07126540000002

您也可以使用大十进制表示法:

​<代码>-71.071265400000020000G​.设置刻度(16)或
​-71.071265400000020000000000g.设定刻度(16)

两者都会导致:

-71.0712654000000200


另一个选项是设置自定义值。

在我看来,这两个值都有7位精度,其余只是错误。当精度为15-16位时,四舍五入到16位小数是不合适的。为了精确表示,请这样做:
BigDecimal a=new BigDecimal(“-71.07126540000002”)
。双打的小数部分没有精确的表示法。寻找精确的匹配有点可笑。您给出的数字相距不到一微米,只有几个数量级。出于所有实际原因,这是同一个位置。即使在赤道,小数点后5位也精确到一米左右。你真的需要比这更精确吗?(也就是说,我敢打赌,你对这个位置的评价绝对没有你所说的那么精确)