当我在Java中尝试以下代码时:
System.out.println("0.1d/0.3d is " + 0.1d/0.3d)
System.out.println("0.1f/0.3d is " + 0.1f/0.3d)
我得到以下输出:
0.1d/0.3d is 0.33333333333333337
0.1f/0.3d is 0.3333333383003871
如果float / double应该得到一个double,那么float / double应该与double / double相同。
答案 0 :(得分:1)
是的“milbrandt”当我们通过隐式类型转换将浮动数量转换为double时,小数点处的某些信息会有所不同。这就是为什么它在分割 float / double。
时显示不同的结果答案 1 :(得分:1)
您可能知道,double
使用64位来存储值,但float
32位。
要表示有效数,double
使用52位,float
使用23位。因此,double
最多可以提供15位数的精度,float
可以提供7位数。
如果你做float / double
,你实际上试图将一个浮点数除以最多7位精度(远精确),浮点数最多为15位精度(更接近精确),然后隐式将结果强制转换为具有15位精度的浮点数。类型转换无法将结果从7位精度恢复为15位。因此,结果是不同的,尽管它们都是double
。
答案 2 :(得分:1)
只需执行以下代码即可查看要检查的二进制数字字符串:
System.out.println(Long.toBinaryString(Double.doubleToLongBits(0.1d)));
System.out.println(Integer.toBinaryString(Float.floatToIntBits(0.1f)));
<强>输出:强>
11111110111001100110011001100110011001100110011001100110011010
111101110011001100110011001101
你看到浮点和双位的区别。因此,对于较长的精度值,我们无法获得float / double和double / double的相同结果。
答案 3 :(得分:0)
用浮点数初始化一个double然后除。你会看到相同的结果。
double f = 0.1f;
double d = 0.1d;
double n = 0.3d;
System.out.println("float /double = " + f/n);
System.out.println("double/double = " + d/n);
结果是
float /double = 0.3333333383003871
double/double = 0.33333333333333337
答案 4 :(得分:0)
您之所以看到这种差异,是因为您没有这些确切的值。
即使我们假设0.1d
和0.3d
是准确的(它们不是,您可以在结果0.33333333333333337
上看到的内容),0.1f
是{{ 1}},这有所不同。