代码之家  ›  专栏  ›  技术社区  ›  ArtOfCode

从什么时候开始3/5=0?

  •  -8
  • ArtOfCode  · 技术社区  · 9 年前

    所以我得到了一段很好的、复杂的C#代码,用来处理代入数学方程的问题。它工作得几乎完美。然而,当给定方程式时 (x - y + 1) / z 和值 x=2 y=0 z=5 它失败得很惨,令人费解。

    问题不在于传递给函数的值是错误的。没关系。问题是,无论我使用什么类型,C#似乎都认为3/5=0。

    这是一段有问题的代码:

    public static void TrapRule(string[] args)
        {
            // ...
    
            string equation = args[0];
            int ordinates = Convert.ToInt32(args[1]);
            int startX = Convert.ToInt32(args[2]);
            int endX = Convert.ToInt32(args[3]);
            double difference = (endX - startX + 1) / ordinates;
    
            // ...
        }
    

    它通过了 args 作为:

    args[0] = Pow(6,[x])
    args[1] = 5
    args[2] = 0
    args[3] = 2
    

    (顺便说一下,使用NCalc Pow() 函数通过该函数求值-这很好。)

    结果如何? difference = 0 .

    使用时也会发生同样的情况 float ,尝试简单数学时:

    Console.Write((3 / 5));
    

    产生相同的结果。

    发生什么事?

    2 回复  |  直到 9 年前
        1
  •  6
  •   Steve    9 年前

    /运算符查看其操作数,当发现它们是两个整数时,返回一个整数。如果要返回一个双精度值,则需要将两个整数中的一个转换为双精度值

    double difference = (endX - startX + 1) / (double)ordinates;
    

    您可以在 C# reference

        2
  •  1
  •   Joel Coehoorn    9 年前

    它们被称为整数。整数不存储数字的任何小数部分。此外,当你将一个整数除以另一个整数时。。。结果仍然是整数。

    所以当你在整数域中取3/5时,你不能存储.6的结果。你只剩下0。分数部分始终被截断,从不舍入。大多数编程语言都是这样工作的。

    对于这种情况,我建议在 decimal 类型。

    推荐文章