我刚刚遇到 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 中,float
和 double
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/