为什么浮动是双重铸造的不精确,双重浮动不是?

Bev*_*vor 2 java floating-point double casting

我知道浮动点变量在投射时会失去精度.但是我不明白的是,为什么从较小的原语到较大的原语的演员是不确定的,反之亦然.我会理解,如果它发生在从double到float,但它是另一种方式.为什么会这样?

查看这两个测试的结果:

@Test
public void castTwoPrimitiveDecimalsUnpreciseToPrecise()
{
    float var1 = 6.2f;
    double var2 = var1;

    assertThat(var2, is(6.2d)); //false, because it's 6.199999809265137
}

@Test
public void castTwoPrimitiviesDecimalsPreciseToUnpresice()
{
    double var1 = 7.6d;
    float var2 = (float)var1;

    assertThat(var2, is(7.6f)); //true
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*han 8

精度问题在于变量的初始化,而不是转换.

在第一种情况下,您从一个只是十进制6.2的浮点近似的数字开始.对double的转换得到一个double,其值与float近似值完全相同.然后将它与更接近的双近似值进行比较,因此当然不匹配.

在第二种情况下,您从十进制7.6的双重近似开始.然后将其转换为float.这会将双倍数转为浮点数.舍入两次,在原始转换为double和在转换为浮动时,可以想象产生一个不同的答案,从直接将数字转换为浮点数,但通常你会得到浮点近似值.然后将它与浮点近似值进行比较,因此得到匹配并不奇怪.