Java 初始化变量的方式是否有差异:float f=100;还是浮动f=100f?
爪哇 初始化变量的方式是否存在差异:Java 初始化变量的方式是否有差异:float f=100;还是浮动f=100f?,java,floating-point,Java,Floating Point,爪哇 初始化变量的方式是否存在差异: float f = 100; //implies a cast from integer to float 或 结果会有所不同吗 在这里,我试图用一个非常大的浮动来做,但是看起来精度的损失是一样的 float f1 = (float)2000000000; float f2 = (float)2000000050; float f3 = 2000000000f; float f4 = 2000000050f; System.out.println(f1 +
float f = 100; //implies a cast from integer to float
或
结果会有所不同吗
在这里,我试图用一个非常大的浮动来做,但是看起来精度的损失是一样的
float f1 = (float)2000000000;
float f2 = (float)2000000050;
float f3 = 2000000000f;
float f4 = 2000000050f;
System.out.println(f1 + " " + f2 + " " + (f1==f2) + " " + f3 + " " + f4 + " "+ (f3==f4) );
->2.0E9 2.0E9正确2.0E9 2.0E9正确
双打有什么不同吗?我想结果是一样的。用于解释浮点文字的JLS规则是指
valueOf(String s)
方法的Float
和Double
类型;JLS 5.1.2给出了从整数类型到浮点类型的类型转换规则。两者均指“IEEE 754四舍五入至最近模式”。因此,我认为可以安全地假设结果是相同的。没有双精度。可能重复的是float f1=1.01161128282547f代码>和浮点f2=1.01161128282547代码>,如果您感兴趣。两者都可以直接编译为相同的字节码操作,但是f2
接收的常量(float)1.01161128282547
不同于f1
接收的1.01161128282547f
。@PascalCuoq我假设这是因为float f2=1.01161128282547
经过了一个额外的步骤valueOf
以概念上的无限精度浮点开始,但是f1
表达式将无限精度四舍五入为float
,而f2
将无限精度四舍五入为double
,然后是float
@ajb。十进制数字1.01161128282547是其中一个非常接近两个浮点之间的精确中间值的数字,如果您首先将其四舍五入为双精度
,它会改变结果,而不是直接将其四舍五入为浮点
。
float f1 = (float)2000000000;
float f2 = (float)2000000050;
float f3 = 2000000000f;
float f4 = 2000000050f;
System.out.println(f1 + " " + f2 + " " + (f1==f2) + " " + f3 + " " + f4 + " "+ (f3==f4) );