首页 > 解决方案 > 从 DecimalFormat.format() 获取大数的不正确结果

问题描述

val numberFormatter = NumberFormat.getNumberInstance(Locale.getDefault())
val conversionPattern = "#,##0.####"
val decimalFormatter = numberFormatter as DecimalFormat
decimalFormatter.applyPattern(conversionPattern)

decimalFormatter.format("9999999999999999".toDouble()) // Getting -> "10,000,000,000,000,000"
                                                       // Need    ->  "9,999,999,999,999,999"

怎么了?是否溢出?我正在处理非常大的数字,因此我将BigDecimal其用于基础值,但要使用分组分隔符对其进行格式化,没有 format() 函数可以接受BigDecimal. 如何格式化至少有 20 位数字的数字?

标签: javakotlinbigdecimalinteger-overflowdecimalformat

解决方案


对这么大的数字使用 BigDecimal 或 BigInteger。例如:

decimalFormatter.format(new BigDecimal("9999999999999999"))

double精度浮点数只有大约 15-16 个十进制数字的精度。你的号码有 16 个九。没有完全等于 9999999999999999 的双精度浮点数,所以它被四舍五入到最接近的一个——恰好是 10 16


推荐阅读