簡體   English   中英

在for循環的最后一次迭代中打印

[英]Print on last iteration of for loop

所以我有一個簡單的for循環:

  double bg = 5.0;
  double f = 0.0;
  for(double i = 0; i <= bg; i += 1)
    {
        f = f + ((2 * i + 1)*0.1);

        if(i == bg)
        {
            System.out.printf ("%.1f" , f);
        }
    }

當我為每個實例將i遞增1時,它可以正常工作。 但是當我做我+ = 0.1時它不會打印f。 有什么想法嗎?

您不能像這樣比較浮點數。

通常,兩個浮點數(雙精度)的相等性用類似以下方法檢查

如果(Math.abs(i-bg)<0.00001f)//0.00001f是非常小的值-幾乎為零,請選擇此值以滿足您的需要

有關更多信息,請訪問http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

您的代碼應如下所示

  double bg = 5.0;
  double f = 0.0;
  for(double i = 0; i <= bg; i += 1)
    {
        f = f + ((2 * i + 1)*0.1);

        if (Math.abs(i - bg) < 0.00001f)
        {
            System.out.printf ("%.1f" , f);
        }
    }

浮點數並未完全代表您認為可能存在的所有數字。 例如,將1除以3​​時,將得到0.333 ...,因為您使用的是十進制數字系統。

但是,計算機使用二進制,因此即使0.1看起來是一個簡單而准確的數字,但二進制看起來更像0.0001100011 ...,依此類推,直到無窮大。 而且,由於計算機沒有無限的內存,因此此數字四舍五入為最接近的可能表示形式。 這就是為什么精確比較不起作用的原因。

有很多方法可以解決此問題。 一種選擇是使用已經提到的增量比較。 但是,如果您知道只處理小數點后的數字,則可以用整數代替100。 例如,如果您要進行貨幣計算,這是建議的方法。

在我的圖形工具中,我將遍歷一個整數值並即時計算浮點數:

int bg = 5;
double f = 0.0;
for(int i = 0; i <= bg; i += 1) {
    f = f + ((2 * i + 1)*0.1);

    if(i == bg)
    {
        System.out.printf ("%.1f" , f);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM