为啥 Decimal.Divide(int, int) 有效,但 (int / int) 无效?

Posted

技术标签:

【中文标题】为啥 Decimal.Divide(int, int) 有效,但 (int / int) 无效?【英文标题】: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 也适用于整数作为输入。 【参考方案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。

【讨论】:

以上是关于为啥 Decimal.Divide(int, int) 有效,但 (int / int) 无效?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能成功分配数组?

为啥 byte 的工作速度比 int 慢?类实例化

为啥使用 TensorRT 使用 INT8 推理输出更多数据

python字符串为啥不能用int处理?

为啥我不能添加两个字节并获得一个 int,而我可以添加两个最终字节获得一个字节?

为啥 C++11 类内初始化程序不能使用括号?