【问题标题】:Why does Decimal.Divide(int, int) work, but not (int / int)?为什么 Decimal.Divide(int, int) 有效,但 (int / int) 无效?
【发布时间】:2010-11-05 19:15:44
【问题描述】:

为什么将两个 32 位 int 数除为 (int / int) 返回给我 0,但如果我使用 Decimal.Divide() 我得到正确答案?我绝不是 C# 人。

【问题讨论】:

  • 你能提供一个具体的例子吗? Decimal 是与 Int32 不同的类型。
  • 顺便我发现Decimal.Divide只接受小数作为输入。
  • Decimal.Divide 也适用于整数作为输入。

标签: c# math int divide


【解决方案1】:

int是整数类型;除法两个整数执行 integer 除法,即小数部分被截断,因为它不能存储在结果类型中(也是int!)。相比之下,Decimal 有一个小数部分。通过调用Decimal.Divide,您的int 参数会隐式转换为Decimals。

您可以通过将至少一个参数显式转换为浮点类型来强制对 int 参数进行非整数除法,例如:

int a = 42;
int b = 23;
double result = (double)a / b;

【讨论】:

  • 不错的答案。我还尝试了 Decimal.Divide(a, b) ,它给出了相同的结果。
【解决方案2】:

如果您正在寻找 0

【讨论】:

  • Int32 是有符号整数,你的意思是 0
【解决方案3】:

我认为Decimal.Divide(decimal, decimal) 在返回十进制值(精确)之前隐式将其 2 个 int 参数转换为小数,其中 4/5 被视为整数除法并返回 0

【讨论】:

    【解决方案4】:

    在第一种情况下,您正在进行整数除法,因此结果被截断(小数部分被切掉)并返回一个整数。

    第二种情况,先将int转换成小数,结果是小数。因此它们不会被截断,您会得到正确的结果。

    【讨论】:

      【解决方案5】:

      下面一行:

      int a = 1, b = 2;
      object result = a / b;
      

      ...将使用整数运算来执行。另一方面,Decimal.Divide 采用Decimal 类型的两个参数,因此除法将针对十进制值而不是整数值执行。这相当于:

      int a = 1, b = 2;
      object result = (Decimal)a / (Decimal)b;
      

      要检查这一点,您可以在上述每个示例之后添加以下代码行:

      Console.WriteLine(result.ToString());
      Console.WriteLine(result.GetType().ToString());
      

      第一种情况的输出是

      0
      System.Int32
      

      ..在第二种情况下:

      0,5
      System.Decimal
      

      【讨论】:

        【解决方案6】:

        你想投数字:

        双 c = (双)a/(双)b;

        注意:如果 C# 中的任何参数是双精度,则使用双除法,结果为双精度。因此,以下方法也可以:

        双 c = (双)a/b;

        这是一个小程序:

        static void Main(string[] args)
                {
                    int a=0, b = 0, c = 0;
                    int n = Convert.ToInt16(Console.ReadLine());
                    string[] arr_temp = Console.ReadLine().Split(' ');
                    int[] arr = Array.ConvertAll(arr_temp, Int32.Parse);
                    foreach (int i in arr)
                    {
                        if (i > 0) a++;
                        else if (i < 0) b++;
                        else c++;
                    }
                    Console.WriteLine("{0}", (double)a / n);
                    Console.WriteLine("{0}", (double)b / n);
                    Console.WriteLine("{0}", (double)c / n);
                    Console.ReadKey();
                }
        

        【讨论】:

          【解决方案7】:

          这样标记的答案非常接近,但我认为值得补充的是,使用双精度和小数之间存在差异。

          我不会比维基百科更好地解释这些概念,所以我只提供指针:

          floating-point arithmetic

          decimal data type

          在金融系统中,通常要求我们可以保证一定数量的(以 10 为底)小数位的准确性。如果输入/源数据以 10 为底,但我们以 2 为底执行算术,这通常是不可能的(因为数字的小数扩展所需的小数位数取决于底数;三分之一取无限多个小数以 10 为基数表示为 0.333333... 的位置,但以 3 为基数只需要一位小数:0.1)。

          浮点数的使用速度更快(就 CPU 时间而言;在编程方面它们同样简单),并且在您希望最小化舍入误差时(如在科学应用程序中)首选。

          【讨论】:

          • 您的回复中没有任何内容可以回答原始问题
          【解决方案8】:

          在我的情况下,上面没有任何效果。

          我想要做的是将 278 除以 575 再乘以 100 得到百分比。

          double p = (double)((PeopleCount * 1.0 / AllPeopleCount * 1.0) * 100.0);
          

          %: 48,3478260869565 --> 278 / 575 ---> 0 %: 51,6521739130435 --> 297 / 575 ---> 0

          如果我将 PeopleCount 乘以 1.0,它会变成十进制,除法将是 48.34... 也乘以 100.0 而不是 100。

          【讨论】:

            猜你喜欢
            • 2021-11-18
            • 2018-12-29
            • 1970-01-01
            • 2014-04-26
            • 2015-01-05
            • 1970-01-01
            • 1970-01-01
            • 2021-08-07
            相关资源
            最近更新 更多