[英]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.