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