2017-07-13 127 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