This question already has answers here:
Is floating point math broken?
                                
                                    (31个答案)
                                
                        
                        
                            Java float unexpectedly rounded
                                
                                    (3个答案)
                                
                        
                                3年前关闭。
            
                    
我尝试了以下for循环:

for(double i = 0.0; i<=0.001; i+=0.0001)
    System.out.println(i);


我得到以下输出:


  0.0
  1.0E-4
  2.0E-4
  3.0000000000000003E-4
  4.0E-4
  5.0E-4
  6.000000000000001E-4
  7.000000000000001E-4
  8.000000000000001E-4
  9.000000000000002E-4


我的问题是:


这些额外的.000000000000001是怎么来的?
这些额外的数字会一直出现吗,还是我的代码有问题?
这些错误是否仅在Java语言或任何其他编程语言中发生?
double是否适合for循环?

最佳答案

可悲的是,并非所有数字都可以用floating point精确表示:


  例如,十进制数0.1不能用二进制表示
  任何有限精度的浮点;确切的二进制
  表示将有一个“ 1100”序列无休止地连续:
  
  e = −4; s = 1100110011001100110011001100110011 ...,其中
  以前,s是有效数字,e是指数。
  
  当四舍五入为24位时,
  
  e = −4; s = 110011001100110011001101,实际上是
  以十进制表示的0.100000001490116119384765625。

07-24 19:53