java浮点转换为字符串,得到不同的结果
为什么下面的java代码打印相同浮点变量的不同值(小数部分)java浮点转换为字符串,得到不同的结果,java,floating-point,floating-point-conversion,Java,Floating Point,Floating Point Conversion,为什么下面的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)); }
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)
使用文档中描述的算法:
混淆源于行
float f=2001797.11f代码>。与数学值最接近的浮点值“2001797.11”
实际上是2001797.125
。你可以通过这样做看到这一点
System.out.println(new BigDecimal(2001797.11f));
因此,f
实际上是2001797.125
,并且String.format
的两种用法已正确舍入
那么为什么Float.toString(f)
不产生“2001797.125”
?这是因为Float.toString
只显示足够的小数位,以便将值与其他Float
s区分开来。在这种情况下,只需在小数点后显示<代码> 1代码>代码即可。 您必须考虑<代码>浮点< /代码>和<代码>双< /代码>类型处理浮点数:这意味着它们必须在整数和小数部分之间分配其32位或64位。< /P>
因此:整数部分的位数越多,专用于整数部分的位数就越多,小数部分的位数就越少。因此,小数部分的精确度较低
您面临的问题来自两个事实:
- 整数部分的位数太多
- 使用float
如果需要更高的精度(根据程序必须处理的值的比例),则应迁移到double
。如果你想要无限精度,我想这可能是屏幕后面的舍入,但我想知道为什么我只是想打印相同的变量。它们中没有一个给出实际值2001797.11
太大,无法精确表示浮动精度,因此我们是否应该根据设计将其称为缺陷或特性?