为什么将两个 32 位 int 数除为 (int / int) 返回给我0
,但如果我使用Decimal.Divide()
我得到正确答案?我绝不是 ac# 的家伙。
8 回答
int
是整数类型;除以两个整数执行整数除法,即小数部分被截断,因为它不能存储在结果类型中(也是int
!)。Decimal
,相比之下,有一个小数部分。通过调用Decimal.Divide
,您的int
参数会被隐式转换为Decimal
s。
int
您可以通过将至少一个参数显式转换为浮点类型来强制对参数进行非整数除法,例如:
int a = 42;
int b = 23;
double result = (double)a / b;
在第一种情况下,您正在进行整数除法,因此结果被截断(小数部分被截断)并返回一个整数。
第二种情况,先将int转换成小数,结果是小数。因此它们不会被截断,你会得到正确的结果。
以下行:
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
我认为Decimal.Divide(decimal, decimal)
在返回一个十进制值(精确)之前将其 2 个 int 参数隐式转换为小数,其中 4/5 被视为整数除法并返回 0
您要转换数字:
双 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();
}
如果您正在寻找 0 < a < 1 的答案,则 int / int 是不够的。int / int 进行整数除法。尝试在操作中将其中一个 int 转换为 double。
就我而言,上面没有任何效果。
我想要做的是将 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。
标记为这样的答案非常接近,但我认为值得补充的是,使用双精度和小数之间存在差异。
我不会比维基百科更好地解释这些概念,所以我只提供指针:
在金融系统中,通常要求我们可以保证一定数量(以 10 为基数)的小数位准确性。如果输入/源数据以 10 为底,但我们以 2 为底执行算术,这通常是不可能的(因为数字的小数扩展所需的小数位数取决于底数;三分之一取无限多个小数以 10 为底数表示为 0.333333... 的位置,但以 3 为底数只需要一位小数:0.1)。
浮点数使用起来更快(就 CPU 时间而言;在编程方面它们同样简单),并且在您想要最小化舍入误差(如在科学应用程序中)时首选。