2016-11-10 4 views
1

Я пытаюсь научиться C#, и я был заинтересован в попытке написать простой Do-то время, чтобы вычислить квадратный корень простого числаручной квадратный корень код дает странный выход

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; как корень + = 1; он отлично работает даже для ответов , но как только я начну использовать 0.1 или меньше, он разрывается, и даже игнорирует его проверку в операторе while.

Может кто-нибудь объяснить, почему это происходит? ПРИМЕЧАНИЕ. Мне не нужно решение, просто причина, почему это происходит. И я знаю, что могу использовать Math.Sqrt (значение);

+1

Не используйте дважды, поплавок для сравнения чисел с плавающей запятой! http://csharpindepth.com/Articles/General/FloatingPoint.aspx – mybirthname

+1

'while ((корень * корень) - x

ответ

1

Кредиты @JonSkeet для его ответа here (и @PaulHicks для упоминания о нем)

поплавок и двойной плавающей точкой двоичных типов. Другими словами, они представляют собой ряд так:

10001,10010110011

Двоичное число и расположение двоичной точки оба закодированный в пределах установленного значения.

decimal - тип плавающей десятичной точки. Другими словами, они представляют собой ряд так:

12345,65789

делают это, как это, следовательно, устраняет эту проблему:

int x = 4; 
decimal root = 0; 
do 
{ 
    root += 0.0001M; 
} 
while ((root * root) % x != 0); 
Trace.WriteLine(Math.Sqrt(x)); 
Trace.WriteLine(root); 
+0

Как это может быть прецизионная ошибка, если она даже ломается при 0,1? и он также пропускает правильный ответ, хотя он печатается –

+0

Возможно, вы захотите прочитать больше здесь: http://stackoverflow.com/q/618535/3195526 –

+0

@PaulHicks Спасибо за эту ссылку –