我正在格式化一个十进制数字,并且我有以下条件对其进行格式化:


该数字最多应保留两位小数(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

最佳答案

问题是,您不能首先将1111111111111111110.567完全表示为double。 (您甚至无法准确地表示出您的最短值,但是随着幅度的增加,误差会大大增加。)

无论如何,double仅具有约17个有效数字的有效数据-您正试图获得22个数字。

如果要提高精度,请使用BigDecimal-但请注意,这也会改变其他情况。无论如何,您想代表什么样的价值?自然值(重量,距离等)适用于double;人工值(尤其是货币值)适用于BigDecimal

10-07 15:25