Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于精确双精度的Java格式字符串?_Java_String_Formatting - Fatal编程技术网

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

用于精确双精度的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(

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

有没有比下面的破解更好的建议,包括解析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);
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
变量精度。在所有情况下,除非您能够删除e
String.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