java - 为什么 float to double cast 不精确,double to float 不精确?

标签 java casting floating-point double

我知道浮点变量在转换时会降低精度。但我不明白的是,为什么从较小的基元到较大的基元的转换是不精确的,反之亦然。如果它是从 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
}

最佳答案

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

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

在第二种情况下,您从对十进制 7.6 的双重近似开始。然后将其转换为 float 。这会将 double 舍入为 float。四舍五入,在原始转换为 double 和转换为 float 时,可以想象会产生与直接将数字转换为 float 不同的答案,但通常你会得到 float 近似值。然后,您将它与 float 近似值进行比较,因此得到匹配也就不足为奇了。

关于java - 为什么 float to double cast 不精确,double to float 不精确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20020493/

相关文章:

php - 在php中将字符串转换为整数时返回零

c - IEEE754中是否有关于加法的中性元素

c++ - 如果小数位数大于 0,如何使用 printf 只打印小数?

java - 抽象静态成员初始化

java - Java 继承的问题

JavaFX RadioButtons 不起作用(无法选择)

java - 重新启动 Swing 应用程序

c++ - 是否可以将派生类数组截断为 C++ 中的基类数组?

c++ - 直接type cast derived到基类调用重载函数

java - float 的格式