为啥 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
参数会隐式转换为Decimal
s。
您可以通过将至少一个参数显式转换为浮点类型来强制对 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) 无效?的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 TensorRT 使用 INT8 推理输出更多数据