我格式化的十进制数,我有以下标准进行格式化:
- 号码应该是最多两位小数(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
。
我设法得到这个(你必须使用BigDecimal
):
import java.math.BigDecimal;
import java.text.NumberFormat;
public class Sandbox {
public static void main(String[] args) {
BigDecimal x = new BigDecimal("1111111111111111110.567");
DecimalFormat formatter = new DecimalFormat("###,###.00");
System.out.println(formatter.format(x));
}
}
OUTPUT:
1,111,111,111,111,111,110.57
资源链接: DecimalFormat
和BigDecimal
还有一件事,你要进入的BigDecimal号作为String
,否则会引起问题。
BigDecimal x = new BigDecimal(1111111111111111110.567) will output the following.
1,111,111,111,111,111,168.00