1

我想知道为什么在使用此代码时会丢失精度:

double x = 12.0456;    // or float : same result
System.out.println(x); // outputs 12.0456 obviously
x %= 1;                // should now be equal to 0.0456 right?
System.out.println(x); // outputs 0.04560000000000031 or 0.045599937 when using float

12.0456 模 1 应该等于 0.0456 对吗?但是它显示的值略有不同,为什么我一直在丢失精度?我的意思是代码应该正好减去 1,直到值小于 1。

但是,我找到了一种获得正确值的方法:

double x = 12.0456;
System.out.println(x);
x %= 1;
System.out.println((float)x); //outputs 0.0456 exactly

这种方式效果很好,但是你们有更好的解决方案吗?

我不在乎我应该使用哪种浮点类型,我只想找到一种干净的方法来获得正确的值!我不喜欢将值转换为双精度然后再转换为浮点数。

4

1 回答 1

2

Float 和 double 是不精确的 - 它们具有有限数量的位来表示一个值。

因为人类使用以 10 为底,而计算机使用以 2 为底,所以对我们来说看起来“简单”的数字可能无法准确地表示为浮点数/双精度数,尤其是由于 CPU 执行方式而导致的计算结果。

于 2013-02-09T22:59:34.813 回答