为什么 Decimal.Divide (int,int)可以工作,而(int/int)不行?

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

113380 次浏览

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

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

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

如果要查找0 < a < 1的答案,int/int 不足以满足要求。Int/int 进行整数除法。尝试在操作中将一个 int 类型转换为 double 类型。

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

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

在第二种情况下,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

你想要投出数字:

Double c = (double) a/(double) b;

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

Double c = (double) 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();
}

标记为这样的答案非常接近,但我认为值得补充的是,使用双精度和小数之间有一个区别。

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

浮点数算法浮点数算法

十进制数据类型十进制数据类型

在金融系统中,通常要求我们能够保证一定数量(以10为基数)的小数位精度。如果输入/源数据位于基数 -10,那么这通常是不可能的,但是我们在基数 -2中执行算法(因为一个数字的十进制展开所需的小数位数取决于基数; 三分之一需要无限多个小数位才能在基数 -10中表示为0.333333... ,但是在基数 -3:0.1中只需要一个小数)。

浮点数使用起来更快(在 CPU 时间方面; 在编程方面它们同样简单) ,而且只要您想最小化舍入误差(如在科学应用程序中) ,就首选浮点数。

在我的情况下,没有什么工作以上。

what I want to do is divide 278 by 575 and multiply by 100 to find percentage.

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

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

如果我把人口统计数乘以1.0就是十进制除法就是48.34。 也乘以100.0而不是100。