为什么在C ++和Java中使用float函数会产生不同的结果?

时间:2014-09-29 04:16:19

标签: java c++

我刚刚遇到this网站并试图用Java和C ++做这件事。为什么在Java中编写以下内容会产生0.30000000000000004

double x = 0.1 + 0.2;
System.out.print(x);

而在C ++中编写以下内容会产生0.3?

double x = 0.1 + 0.2;
cout<<x;

3 个答案:

答案 0 :(得分:3)

C ++标准无法保证使用IEEE 754 floating point arithmetic,因此结果实际上是实现定义的。但是,大多数实现都会这样做。

在Java中,floatdouble are defined to be IEEE 754 floating point types。此外,您可以将strictfp修饰符添加到类或方法声明中,以要求严格的IEEE 754浮点运算甚至用于中间结果。

在处理浮点数时,如果有疑问,查看实际位表示通常很有用。

#include <cstdint>
#include <cstdio>

int
main()
{
  static_assert(sizeof(double) == sizeof(uint64_t), "wrong bit sizes");
  const double x = 0.1 + 0.2;
  const uint64_t bits = *reinterpret_cast<const uint64_t *>(&x);
  printf("C++:  0x%016lX\n", bits);
  return 0;
}
public final class Main {
    public static void main(final String[] args) {
        final double x = 0.1 + 0.2;
        final long bits = Double.doubleToLongBits(x);
        System.out.printf("Java: 0x%016X\n", bits);
    }
}

当我在我的计算机上执行这两个程序(带有GCC和OpenJDK的GNU / Linux)时,输出是

C++:  0x3FD3333333333334
Java: 0x3FD3333333333334

表明两者都产生完全相同的结果。但是,便携式程序不应该依赖于此。

答案 1 :(得分:2)

在IEEE浮点表示中,0.1和0.2(也不是0.3)都不是精确值。只有负2的幂和它们的组合将是(例如,0.5,0.25,0.75 ......)。

因此,您看到的差异只是Matt Adams所说的默认输出格式的差异。

答案 2 :(得分:0)

确定您的精度级别,并专门为输出流设置应显示相同的