java 中的双精度乘法给出了错误的结果

multiplication of doubles in java gives a wrong result

这是 jvm 中的错误吗?下面的代码给出了结果:409.99999999999994!

public class HelloWorld{
     public static void main(String []args){
          double d = 4.10d;
          double d2 = d * 100d ;
          System.out.println(d2);
     }
 }

将 double 改为 float 可以解决问题,但为什么呢?

计算机使用有限数量的位来表示数字,因此不可能准确地表示所有数字。您看到的是四舍五入到计算机实际可以表示的数字的结果。

What Every Computer Scientist Should Know About Floating-Point Arithmetic 值得一读,因为这是你第一次看到这个。