我有一个问题是由另一个关于 float 精度的问题引起的。
现在,我知道 float 并不总是能准确表示,因此它们被存储为最接近的可以表示的 float 。
我的问题实际上是关于 float
的表示差异和 double
.
这个问题从何而来?
假设我这样做:
System.out.println(.475d+.075d);
那么输出就不会是0.55
但是0.549999
(在我的机器上)
但是,当我这样做时:
System.out.println(.475f+.075f);
我得到了正确答案,即 0.55
(有点出乎我的意料)
到目前为止,我的印象是double
比 float
具有更高的精度(double 会更准确,小数位数越多) .因此,如果 double 不能精确表示,那么它的等效 float 表示也将被不准确地存储。
然而,我得到的结果让我有点不安。如果出现以下情况,我会感到困惑:
- 我对
precision
的理解有误意味着什么? -
float
和double
除了 double 有更多位数之外,它们的表示方式不同吗?
最佳答案
可以表示为float
的数字也可以表示为double
。
您读取的只是格式化输出,您没有读取实际的二进制表示。
System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(.475d + .075d)));
// 11111111100001100110011001100110011001100110011001100110011001
System.out.println(Integer.toBinaryString(Float.floatToRawIntBits(.475f + .075f)));
// 111111000011001100110011001101
double d = .475d + .075d;
System.out.println(d);
// 0.5499999999999999
System.out.println((float)d);
// 0.55 (as expected)
System.out.println((double)(float)d);
// 0.550000011920929
System.out.println( .475f + .075f == 0.550000011920929d);
// true
关于java - 是否有可能精确表示为 float 的数字不能精确表示为 double?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10956688/