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)
精度问题在于变量的初始化,而不是转换.
在第一种情况下,您从一个只是十进制6.2的浮点近似的数字开始.对double的转换得到一个double,其值与float近似值完全相同.然后将它与更接近的双近似值进行比较,因此当然不匹配.
在第二种情况下,您从十进制7.6的双重近似开始.然后将其转换为float.这会将双倍数转为浮点数.舍入两次,在原始转换为double和在转换为浮动时,可以想象产生一个不同的答案,从直接将数字转换为浮点数,但通常你会得到浮点近似值.然后将它与浮点近似值进行比较,因此得到匹配并不奇怪.
| 归档时间: |
|
| 查看次数: |
293 次 |
| 最近记录: |