Java 浮动格式问题
Java float formatting issue
我从 XML 文件中检索了一个浮点数,我想将其格式化并插入到文本文件中,格式为逗号后 8 位,逗号前 2 位。
这是我的代码:
String patternNNDotNNNNNNNN = "%11.8f";
float value = 1.70473711f;
String result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, value);
System.out.println(result);
结果我得到:1.70473707
如果我使用同样的问题:
java.text.DecimalFormatSymbols symbols = new java.text.DecimalFormatSymbols(java.util.Locale.US);
java.text.DecimalFormat df = new java.text.DecimalFormat("##.########", symbols);
System.out.println(df.format(value));
我不明白为什么我有一个四舍五入的值(1.70473711变成1.70473707)。
这是因为float
的精度意味着值1.7043711
实际上不是1.7043711
。
考虑以下哪个进程 1.70473711f
既是 float
又是 double
:
String patternNNDotNNNNNNNN = "%11.8f";
float valueF = 1.70473711f;
String result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, valueF);
System.out.println(valueF);
System.out.println(result);
double valueD = 1.70473711f;
result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, valueD);
System.out.println(valueD);
System.out.println(result);
输出:
1.7047371
1.70473707
1.7047370672225952
1.70473707
将值视为双精度值时,您可以看到 1.7043711f
实际上是 1.7047370672225952
。将其四舍五入到 8 位会得到 1.70473707
和 而不是 1.70473711
。
相反,将数字视为双精度数(即删除 f
),提高精度将产生预期的输出:
double valueD = 1.70473711;
String result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, valueD);
System.out.println(valueD);
System.out.println(result);
输出:
1.70473711
1.70473711
String.format
对浮点值 做 舍入。如果您不想那样,请使用 BigDecimal
。参见
double d = 0.125;
System.out.printf("%.2f%n", d);
我从 XML 文件中检索了一个浮点数,我想将其格式化并插入到文本文件中,格式为逗号后 8 位,逗号前 2 位。
这是我的代码:
String patternNNDotNNNNNNNN = "%11.8f";
float value = 1.70473711f;
String result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, value);
System.out.println(result);
结果我得到:1.70473707
如果我使用同样的问题:
java.text.DecimalFormatSymbols symbols = new java.text.DecimalFormatSymbols(java.util.Locale.US);
java.text.DecimalFormat df = new java.text.DecimalFormat("##.########", symbols);
System.out.println(df.format(value));
我不明白为什么我有一个四舍五入的值(1.70473711变成1.70473707)。
这是因为float
的精度意味着值1.7043711
实际上不是1.7043711
。
考虑以下哪个进程 1.70473711f
既是 float
又是 double
:
String patternNNDotNNNNNNNN = "%11.8f";
float valueF = 1.70473711f;
String result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, valueF);
System.out.println(valueF);
System.out.println(result);
double valueD = 1.70473711f;
result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, valueD);
System.out.println(valueD);
System.out.println(result);
输出:
1.7047371
1.70473707
1.7047370672225952
1.70473707
将值视为双精度值时,您可以看到 1.7043711f
实际上是 1.7047370672225952
。将其四舍五入到 8 位会得到 1.70473707
和 而不是 1.70473711
。
相反,将数字视为双精度数(即删除 f
),提高精度将产生预期的输出:
double valueD = 1.70473711;
String result = String.format(java.util.Locale.US, patternNNDotNNNNNNNN, valueD);
System.out.println(valueD);
System.out.println(result);
输出:
1.70473711
1.70473711
String.format
对浮点值 做 舍入。如果您不想那样,请使用 BigDecimal
。参见
double d = 0.125;
System.out.printf("%.2f%n", d);