用于精确双精度的Java格式字符串?
我想要像String.valueOf(double)一样格式化Java double,也就是说,不损失精度。但我需要使用依赖于区域设置的分隔符,并且更喜欢格式设置程序字符串,如String.format。我不需要几个数字的垂直对齐。示例(在Locale.US中): 有没有比下面的破解更好的建议,包括解析String.valueOf(d)的结果来计算小数位数用于精确双精度的Java格式字符串?,java,string,formatting,Java,String,Formatting,我想要像String.valueOf(double)一样格式化Java double,也就是说,不损失精度。但我需要使用依赖于区域设置的分隔符,并且更喜欢格式设置程序字符串,如String.format。我不需要几个数字的垂直对齐。示例(在Locale.US中): 有没有比下面的破解更好的建议,包括解析String.valueOf(d)的结果来计算小数位数 double d = ... String s = String.valueOf(d); int exponent = s.indexOf(
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);
double d=。。。
字符串s=字符串。值(d);
int指数=s.indexOf('E');
整数小数;
如果(0检查十进制格式:查看或
例如:
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
但是,当涉及到精度时,你可能应该考虑使用不同的数据类型。
十进制格式可能是一个更好的选择。如果精度是一个问题,你应该使用java. Math.BigDimple来进行计算。双和浮点都可能丢失精度。(与金钱无关),只是关于失去相对于双精度值的精度。由于您在的注释中指出您需要有效的字符串。format
format String,请查看String.format
变量精度。在所有情况下,除非您能够删除eString.format
限制和使用,例如,NumberFormat
。谢谢-我不需要比doubles提供的精度更高的精度(我不需要钱)。除了setGroupingUsed之外,我确实需要调用setMin/MaxFractionDigits,但它的行为与所需的一样。除了……我无法与我的其余代码所基于的String.format进行互操作:-/Oh-和NumberFormat的行为与NaN和+/-Infinity上的String.format不同。您可以任意扩展NumberFormat,f或者示例DecimalFormat也是NumberFormat的扩展。请随意更改其行为以解决您的问题。不幸的是,我不理解您所说的与String.format的哪种互操作。我的意思是通过找到合适的格式字符串来解决问题。我正在使用一个将格式字符串作为参数的API。
1,234,567,890.123