java - 为什么这个float操作在C++和Java中给出不同的结果?

标签 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;

最佳答案

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

在 Java 中,floatdouble are defined to be IEEE 754 floating point types .此外,您可以添加 strictfp类或方法声明的修饰符,要求使用严格的 IEEE 754 浮点算法,即使对于中间结果也是如此。

在处理 float 时,如有疑问,查看实际的位表示通常很有用。

#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);
    }
}

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

C++:  0x3FD3333333333334
Java: 0x3FD3333333333334

这表明两者产生完全相同的结果。但是,可移植程序不应依赖于此。

关于java - 为什么这个float操作在C++和Java中给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26092469/

相关文章:

c++ - 查找所有在 Boost 中排序的

c++ - setData 为 QAbstractProxyModel 返回 false

c++ - 从 map 中删除时出现奇怪的段错误

Java 从泛型 Class 对象获取方法

java - 为什么调用 System.gc() 是不好的做法?

java - 如何从 wsdl 文件中的 Web 服务端点删除端口号

c++ - vector 的数据如何对齐?

Java:三种可能类型的一个字段?

java - Android DecimalFormat 格式不正确

c++ - 有条件地在c++中创建一个对象