use*_*126 5 java precision double tostring decimalformat
核心问题是我需要记录一系列双打,每个双打都有不同数量的有效数字.数字的变化有很大的数字.一些有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"
Run Code Online (Sandbox Code Playgroud)
当然我尝试使用DecimalFormat("#.#######"),这解决了丢失有效数字的问题,但它为许多低精度双精度打印了无关紧要的数字.即
1308.75 -> "1308.7499998"
Run Code Online (Sandbox Code Playgroud)
这也是不可接受的,因为它浪费了大量的空间(通常每天记录> 2 GB的数据)和2)它使用日志弄乱了应用程序.
在识别有效数字时,与toString()相比,DecimalFormat似乎很糟糕,无论如何要修复它?我只想使用toString()样式处理有效数字,并将最大位数从6扩展到7.
有任何想法吗?谢谢
如果你担心完全保留十进制值,你应该使用BigDecimal- double从根本上说是不合适的,作为二进制浮点类型.
事实上,我无法重现你的1308.75 in的行为DecimalFormat,这并不让我感到惊讶,因为这个值可以完全表示为a double.事实上,DecimalFormat无论如何似乎应用了一些启发式,因为即使1308.76也是1308.76 - 这让我感到惊讶,实际值是1308.759999999999990905052982270717620849609375.这确实意味着如果你在你的代码中使用1308.7599999999999,它将显示为1308.76,因为它与double所涉及的值完全相同.如果你需要区分这两个值,你肯定应该使用BigDecimal.
另请注意,1308.75有6 位有效数字 - 它有2 位小数.值得注意区分这两个概念.
| 归档时间: |
|
| 查看次数: |
10660 次 |
| 最近记录: |