我有一个 XSD ,要求我对纬度/经度使用 BigDecimal。我目前将纬度/经度作为双精度数,并将它们转换为 BigDecimal,但我只需要使用大约 12 位精度。我一直无法弄清楚如何设置它。谁能帮我这个?
原文由 Jason 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一个 XSD ,要求我对纬度/经度使用 BigDecimal。我目前将纬度/经度作为双精度数,并将它们转换为 BigDecimal,但我只需要使用大约 12 位精度。我一直无法弄清楚如何设置它。谁能帮我这个?
原文由 Jason 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以使用 setScale() 例如
double d = ...
BigDecimal db = new BigDecimal(d).setScale(12, BigDecimal.ROUND_HALF_UP);
原文由 Peter Lawrey 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
1 回答2.1k 阅读✓ 已解决
题目问的是精度。 BigDecimal 区分小数位数和精度。比例是小数位数。您可以将精度视为 有效数字 的个数,也称为有效数字。
Clojure 中的一些示例。
(在 Clojure 中,
M
指定一个 BigDecimal 文字。您可以根据需要将 Clojure 翻译成 Java,但我发现它比 Java 更紧凑!)您可以轻松地增加规模:
但是您不能以完全相同的方式 减小 比例:
您还需要通过舍入模式:
因此,更改比例很容易。但是精度呢?这并不像您希望的那么容易!
很容易 降低 精度:
但是如何 提高 精度并不明显:
对于持怀疑态度的人,这 不仅仅是 不显示尾随零的问题:
FWIW,Clojure 对尾随零非常小心, 并将 显示它们:
回到正轨…您可以尝试使用 BigDecimal 构造函数,但它不会将精度设置为高于您指定的位数:
所以,没有快速的方法来改变精度。在写这个问题和我正在从事的项目时,我花了很多时间来解决这个问题。我认为这充其量是一个 CRAZYTOWN API,最坏的情况是一个错误。人们。严重地?
所以,据我所知,如果你想改变精度,你需要执行以下步骤:
这些步骤,作为 Clojure 代码:
我知道,这只是为了改变精度而采取的很多步骤!
为什么 BigDecimal 不提供这个?我忽略了什么吗?