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

我刚刚遇到这个网站并试图用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; 

在IEEE浮点表示中,0.1和0.2(也不是0.3)都不是精确值。 只有2的负功率及其组合将是(例如,0.5,0.25,0.75 ……)。

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

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

在Java中, floatdouble 被定义为IEEE 754浮点类型 。 此外,您可以将strictfp修饰符添加到类或方法声明中,以要求严格的IEEE 754浮点运算甚至用于中间结果。

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

 #include  #include  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(&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 

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

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