将浮点数乘以双倍除以在java中将double除以double

时间:2017-11-30 08:38:16

标签: java

当我在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相同。

5 个答案:

答案 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.1d0.3d是准确的(它们不是,您可以在结果0.33333333333333337上看到的内容),0.1f是{{ 1}},这有所不同。