gpt4 book ai didi

java - 使用具有更多数字的 Java Double.toString() 样式格式(DecimalFormat 不适用于低精度数字)

转载 作者:搜寻专家 更新时间:2023-10-31 19:35:09 25 4
gpt4 key购买 nike

核心问题是我有一系列需要记录的 double ,每个 double 都有不同数量的有效数字。这些数字在有多少有效数字方面差异很大。有些是 0(例如 5257),有些是 2(例如 1308.75),有些一直到 7(例如 124.1171875)。基本上是小数点后 0 到 7 位有效数字之间的所有内容。

标准 Double.toString() 在除具有 7 位有效数字之外的所有方面都表现出色。即一直到 6 位,有效数字全部打印,没有任何无意义的数字。但对于那些有 7 位有效数字的字符串,toString() 会四舍五入最后一位数字。即

5257 -> "5257"
1308.75 -> "1308.75"
124.1171875 -> "124.117188"

当然,我尝试使用 DecimalFormat("#.#######"),这解决了丢失有效数字的问题,但它为许多低精度 double 打印了无意义的数字。即

1308.75 -> "1308.7499998"

这也是 Not Acceptable ,因为 1) 它浪费了大量空间(通常每天记录 >2 GB 的数据)和 2) 它弄乱了使用日志的应用程序。

在识别有效数字方面,与 toString() 相比,DecimalFormat 似乎很糟糕,是否有办法修复它?我只想使用 toString() 样式处理有效数字,并将最大数字位数从 6 扩展到 7。

有什么想法吗?谢谢

最佳答案

如果您担心精确保留十进制值,您应该使用 BigDecimal 开始 - double 从根本上来说是不合适的,因为 binary 浮点类型。

碰巧,我无法在 DecimalFormat 中重现 1308.75 的行为,这并不让我感到惊讶,因为该值 可以完全表示为 。事实上,DecimalFormat 似乎无论如何都在应用一些启发式方法,即使 1308.76 也显示为 1308.76 - 这让我感到惊讶,因为实际值是 1308.759999999999990905052982270717620849609375。这确实意味着,如果您在代码中使用 1308.7599999999999,结果将是 1308.76,因为就 double 而言,它是完全相同的值。如果您需要区分这两个值,您绝对应该使用 BigDecimal

另请注意,1308.75 有 6 个有效数字 - 它有 2 个小数位。仔细区分这两个概念是值得的。

关于java - 使用具有更多数字的 Java Double.toString() 样式格式(DecimalFormat 不适用于低精度数字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6869144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com