我正在格式化十进制数,我有以下标准来格式化它:
-
数字最多应为小数点后两位(10.1234 => 10.12)
-
如果小数点后只有一位数,那么最终会得到一个额外的0(10.5 => 10.50)
-
千位分隔符将是逗号(12345.2345 => 12,345.23)
我写了以下逻辑:
double x = Double.parseDouble(value.toString());
String dec = x % 1 == 0 ? new java.text.DecimalFormat("###,###.##").format(x) : new java.text.DecimalFormat("###,###.00").format(x);
现在正在打印:
11111111111110.567=>11,111,111,111,110.57
111111111111110.567=>111,111,111,111,110.56
1111111111111110.567=>1,111,111,111,111,110.60
11111111111111110.567=>11,111,111,111,111,110
111111111111111110.567=>111,111,111,111,111,104
1111111111111111110.567=>1,111,111,111,111,111,170
我不明白为什么行为会改变 . 我应该如何打印 1111111111111111110.567
作为 1,111,111,111,111,111,110.57
?
2 回答
问题是你不能完全代表1111111111111111110.567作为
double
. (你甚至不能准确地表示你的最短值,但随着你增加幅度,不准确性会显着增加 . )A
double
无论如何只有大约17个有用数据的有效数字 - 你试图得到22位数 .如果你想要更高的精度,请使用
BigDecimal
- 但要注意这也将改变其他事情 . 无论如何,你想要代表什么样的 Value ?自然值(重量,距离等)适用于double
;人工 Value (特别是货币 Value )适用于BigDecimal
.我设法得到了这个(你必须使用
BigDecimal
):OUTPUT:
资源链接:DecimalFormat和BigDecimal
还有一件事,你必须输入BigDecimal数字作为
String
否则会导致问题 .