我正在运行此代码
public class Test{
public static void main(String args[]){
double d = Math.log(125)/Math.log(5);
float f = (float)(Math.log(125f)/Math.log(5f));
System.out.printf("DOUBLE: %.20f\n", d);
System.out.printf("FLOAT : %.20f\n", f);
}
}
并看到以下输出
DOUBLE: 3.00000000000000040000
FLOAT : 3.00000000000000000000
125是5 3 ,因此log(125)/ log(5)理想情况下应为3。如果输出为double,则此输出来自3.00000000000000040000?无法理解原因(内部是什么原因),对此有所帮助。
答案 0 :(得分:-1)
浮点表示法(浮点数和双精度数)的问题之一是它们不以十进制存储值,而是以二进制形式存储它们。这意味着许多数字近似等于(而不是精确地像整数一样)等于其期望值。当您具有更高的精度时,近似值会更好。
在Java中,double使用八个字节表示,而float使用四个字节。因此,在代表任何特定值时,双精度数通常会比浮点数更好(或至少不会更差)。我希望这就是Java设计人员选择double用作浮点文字表示形式的原因。
因此,基本上,当您在Java中说“ float”时,实际上是声明了32位1–8–23 IEEE float,类似地,“ double”是64位1–11–52 IEEE float。