昨天有人问了这个问题。我知道 java 解释3.0
为 adouble
和3f
a float
,并且doubles
具有 64 位精度和floats
32 位精度。如果有人问我,我会给出与给出的答案相似的答案;但是,我想提供经验证据,清楚地表明java
商店3.0
和3f
不同之处。
这是我尝试过的,但收效甚微:
System.out.println("Double: " + Double.toHexString(d)); //prints 0x1.8p1
System.out.println("Float: " + Float.toHexString(f)); //prints 0x1.8p1
System.out.println("Double: " + new Double(d).byteValue()); //prints 3
System.out.println("Float: " + new Float(f).byteValue()); //prints 3
Long l = Double.doubleToLongBits(d);
Integer i = Float.floatToIntBits(f);
System.out.println("Double (long bits): " + l); //prints 4613937818241073152
System.out.println("Float (int bits): " + i); //prints 1077936128
这些是不同的,但这是因为floats
使用单格式(8 位偏置指数)和doubles
双格式(11 位偏置指数)。有关详细信息,请参阅IEEE 算术。我将两者都转换为它们的二进制表示,但又没有得到任何地方:
System.out.println("Long-toBinary: " + Long.toBinaryString(l));
//prints 100000000001000000000000000000000000000000000000000000000000000
System.out.println("Integer-toBinary: " + Integer.toBinaryString(i));
//prints 1000000010000000000000000000000
虽然在 中还有更多0's
,但Long.toBinaryString(l)
乘以加法0's
不会改变结果(开头 1 的不同位置是由于 8 位与 11 位的偏置指数问题)。所以,我仍然没有经验证据来说明为什么下面问题的乘法会产生两个不同的答案。
97346822*3f, result is 2.9204048E8,
然而
97346822*3.0 gives me 2.92040466E8.
3f
并且3.0
必须不同才能使结果不同,但我想不出任何表明它们实际上是的东西。再次,我理解这3f
被解释为 afloat
和3.0
a double
,请不要仅仅回答这个问题。
编辑:
为了澄清,我试图隔离 3.0
并3f
表明它们确实不同。