我正在格式化一个十进制数字,并且我有以下条件对其进行格式化:
该数字最多应保留两位小数(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
。