2017-07-13 165 views
1

這個程序應該適用於條件,至少我認爲,但對於某些值它不工作應該。c#:儘管循環不作爲工作

static void Main(string[] args) 
{ 
    double num, temp = 0; 
    double frac; 
    int j = 1; 

    num = 1034.264;    
    do 
    { 
     j = j * 10; 
     Console.WriteLine(j); 
     temp = num * j; 
     Console.WriteLine(temp); 
    } 
    while ((temp % 10)!=0); 
} 

對於價值1034.347,其做工精細 -

working for 1034.347

但對於價值1034.235 not working 1034.235 它會無限

+3

我不明白爲什麼人們投下了這個問題 - 這是完全合理的,問得好。 – Scrobi

+1

我同意,它寫得很好,有預期的和實際的結果記錄(雖然做內聯會更好)。雖然它很有吸引力,但我覺得它應該有一個簡短的答案,並且與「規範」浮點問題有關。 – Bathsheba

+0

[爲什麼模數運算符不能在double中工作?](https://stackoverflow.com/questions/906564/why-is-modulus-operator-not-working-for-double-in-c) – mjwills

回答

9

C# - 爲了與跟上Joneses - 有一個浮點模數運算符%

當以十進制數表示時,生成的二進制浮點值不太可能會將其所有後續數字設置爲零,因此(temp % 10)!=0)false是一種罕見現象。

在你的情況下,解決方法是在你的值的1000倍中工作,並使用適當的整數類型。

參考:Is floating point math broken?

+0

我不明白在這種情況下,千分之一的因素會有幫助;你是否假設數字在小數點後總是有三個或更少的非零數字? (在我看來,代碼的目的是計算小數點後非零數字的數量,這意味着該數字是未知的。) –

0

浮點數字相等比較是很危險的,因爲浮點操作有一個錯誤。例如。該數字不是零,它是0.0 [...] 01 - 或者:接近零。我建議與一個「帶寬」比較:

abs(nubmer) < 0.000001. 
+1

一個可怕的想法,基於圍繞什麼二進制浮點非常常見的錯誤概念數字實際上是:他們沒有錯誤;它只是浮點集合是實數集合的一個稀疏子集,並且稀疏性不是恆定的,所以主張恆定的相對容忍度實際上是不好的建議。請閱讀我答案中的鏈接。 – Bathsheba