java - 是否有可能精确表示为 float 的数字不能精确表示为 double?

标签 java floating-point double

我有一个问题是由另一个关于 float 精度的问题引起的。

现在,我知道 float 并不总是能准确表示,因此它们被存储为最接近的可以表示的 float 。

我的问题实际上是关于 float 的表示差异和 double .

这个问题从何而来?

假设我这样做:

System.out.println(.475d+.075d);

那么输出就不会是0.55但是0.549999 (在我的机器上)

但是,当我这样做时:

System.out.println(.475f+.075f);

我得到了正确答案,即 0.55 (有点出乎我的意料)

到目前为止,我的印象是doublefloat 具有更高的精度(double 会更准确,小数位数越多) .因此,如果 double 不能精确表示,那么它的等效 float 表示也将被不准确地存储。

然而,我得到的结果让我有点不安。如果出现以下情况,我会感到困惑:

  1. 我对precision的理解有误意味着什么?
  2. floatdouble除了 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/

相关文章:

php计算 float

java - 双原始类型数据的意外行为

Java字符串到双重转换

php - 比较 double 的奇怪行为,两个 PHP double 值不相等

java - 使用结构/类来增加缓存空间局部性?

java - 将类作为参数传递并返回相同的类对象

java.lang.NoClassDefFoundError : com/sap/conn/jco/JCoException Error

java - 为什么我们在单独的文件中声明公共(public)类?

c - 需要使用 Unsigned Int 的浮点精度

c - 17位或更多位 double