2016-11-10 49 views
1

我想學習C#和我很感興趣,試圖寫一個簡單的做,而如果我使用一個計算簡單的數字手動平方根代碼給出了奇怪的輸出

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 



namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 


      double x = Convert.ToDouble(Console.ReadLine()); 
      double root = 0; 
      do 
      { 
       root += 0.0001; 
       Console.WriteLine(root); 
      } 
      while ((root * root) % x != 0); 


      Console.WriteLine(Math.Sqrt(x)); 
      Console.WriteLine(root); 


     } 
    } 
} 

的平方根根號碼= 0.0001;像root + = 1; 它甚至可以很好地解答答案 但是一旦我開始使用0.1或更小的值,它會中斷, ,甚至會忽略while語句中的檢查。

有人可以解釋爲什麼會發生這種情況嗎? 注:我不需要一個解決方案,只是爲什麼發生這種情況。我知道我可以使用Math.Sqrt(value);

+1

不要使用雙,浮法用於浮點數的比較! http://csharpindepth.com/Articles/General/FloatingPoint.aspx – mybirthname

+1

'while((root * root) - xε);'其中'epsilon'是一個足夠小的數字可能是一個更好的比較 –

回答

1

貸@JonSkeet他的回答here(和提它@PaulHicks)

float和double浮動小數點類型。換句話說,它們代表了一些這樣的:

10001.10010110011

的二進制數和二進制小數點的位置都在值的範圍內進行編碼。

十進制是浮點型小數點類型。換句話說,它們代表了一些這樣的:

12345.65789

做這這樣的,因此,解決了這個問題:

​​
+0

它怎麼可能是精度錯誤,如果它甚至打破0.1?它也會跳過正確的答案,雖然它正在打印 –

+0

您可能想在這裏閱讀更多:http://stackoverflow.com/q/618535/3195526 –

+0

@PaulHicks感謝您的鏈接 –