2016-11-10 77 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感谢您的链接 –