java 浮点数转换为字符串给出不同的结果
java float conversion to string giving different result
为什么下面的 java 代码打印相同浮点变量的不同值(小数部分)?
public static void main(String[] args) {
float f = 2001797.11f;
System.out.println(String.format("%013.2f", f));
System.out.println(Float.toString(f));
System.out.println(String.format("%018.5f", f));
}
输出:
0002001797.13
2001797.1
000002001797.12500
String.format
使用显式格式规则
Float.toString(float n)
使用文档中描述的算法:
http://docs.oracle.com/javase/7/docs/api/java/lang/Float.html#toString(float)
混乱源于行 float f = 2001797.11f;
。最接近数学值"2001797.11"
的float
实际上是2001797.125
。您可以通过执行
来查看
System.out.println(new BigDecimal(2001797.11f));
因此,f
实际上是 2001797.125
并且 String.format
的 2 次使用已正确舍入。
那么为什么 Float.toString(f)
不产生 "2001797.125"
?这是因为 Float.toString
只显示足够的小数位,以便将值与其他 float
区分开来。在这种情况下,只显示小数点后的 1
即可。
您必须考虑 float
和 double
类型处理 浮点数 数字:这意味着它们必须在整数和小数部分。
以此类推:整数部分中位数最多的位将专用于它们,小数部分的位数较少。因此,小数部分将 不太准确 。
您遇到的问题来自两个事实:
- 整数部分的位数过多。
- 使用浮动。
如果您需要更精确(根据您的程序必须处理的值的规模),您应该迁移到 double
。如果你想要无限精度,BigDecimal
.
为什么下面的 java 代码打印相同浮点变量的不同值(小数部分)?
public static void main(String[] args) {
float f = 2001797.11f;
System.out.println(String.format("%013.2f", f));
System.out.println(Float.toString(f));
System.out.println(String.format("%018.5f", f));
}
输出:
0002001797.13
2001797.1
000002001797.12500
String.format
使用显式格式规则
Float.toString(float n)
使用文档中描述的算法:
http://docs.oracle.com/javase/7/docs/api/java/lang/Float.html#toString(float)
混乱源于行 float f = 2001797.11f;
。最接近数学值"2001797.11"
的float
实际上是2001797.125
。您可以通过执行
System.out.println(new BigDecimal(2001797.11f));
因此,f
实际上是 2001797.125
并且 String.format
的 2 次使用已正确舍入。
那么为什么 Float.toString(f)
不产生 "2001797.125"
?这是因为 Float.toString
只显示足够的小数位,以便将值与其他 float
区分开来。在这种情况下,只显示小数点后的 1
即可。
您必须考虑 float
和 double
类型处理 浮点数 数字:这意味着它们必须在整数和小数部分。
以此类推:整数部分中位数最多的位将专用于它们,小数部分的位数较少。因此,小数部分将 不太准确 。
您遇到的问题来自两个事实:
- 整数部分的位数过多。
- 使用浮动。
如果您需要更精确(根据您的程序必须处理的值的规模),您应该迁移到 double
。如果你想要无限精度,BigDecimal
.