用于精确双精度的Java格式字符串?

时间:2012-01-10 12:44:35

标签: java string formatting

我想像String.valueOf(double)那样格式化Java双打,也就是说,不会损失精度。但我需要使用依赖于区域设置的千位分隔符,并且更喜欢格式化程序String,如String.format。我不需要垂直对齐几个数字。示例(在Locale.US中):

1.0 -> "1.0"
1.1 -> "1.1"
1.11 -> "1.11"
1000 * Math.PI -> "3,141.592653589793"
1e9 -> "1,000,000,000.0"
1.234567890123e9 -> "1,234,567,890.123"

比下面的hack更好的建议,包括解析String.valueOf(d)的结果来计算小数位数?

double d = ...
String s = String.valueOf(d);
int exponent = s.indexOf('E');
int decimals;
if (0 <= exponent) {
   decimals = Math.max(1, exponent - s.indexOf('.') - Integer.parseInt(s.substring(exponent + 1)) - 1);
}
else {
   decimals = s.length() - s.indexOf('.') - 1;
}
String format = "%,." + decimals + "f";
System.out.printf("Value: " + format + "\n", d);

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

查看NumberFormatDecimalFormat

例如:

double d = 1.234567890123e9;

//Initiating a format depending on current locale:
final NumberFormat format = NumberFormat.getInstance();
format.setGroupingUsed( true );
System.out.println( format.format( d ) );

打印:

1,234,567,890.123

但是在精确度方面,您可能应考虑使用其他数据类型,如BigDecimal