为什么小数。分(int,int)的工作,但未(int/int)?
题
怎么划分两个32位int数字作为(int/int)返回到我 0
, 但是如果我使用 Decimal.Divide()
我得到正确的答案?我不c#家伙。
解决方案
int
是整数类型;除以两个整数执行整数除法,即小数部分被截断,因为它不能被存储在结果类型(也int
!)。 Decimal
,相比之下,得到了一个小数部分。通过调用Decimal.Divide
,你int
论点得到隐式转换为Decimal
s。
您可以通过显式铸造的参数的至少一个浮点型,e.g执行非整数除法上int
参数:
int a = 42;
int b = 23;
double result = (double)a / b;
其他提示
在第一种情况下,你正在做的整数除法,所以结果被截去(小数部分被切掉),并返回一个整数。
在第二种情况下,整数转换为小数第一,结果是小数。因此,他们不会将其截断,你会得到正确的结果。
在下面的行:
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)
隐含其中作为4/5被视为整数除法,并返回返回一个十进制值(精确)之前其2个INT参数小数转换0
你想要投的数字:
双c=(double)a/(double)b;
注:如果任何论点在C#是一个双人间,双鸿沟使用其结果在一倍。因此,以下工作:
双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();
}
如果您正在寻找0 <α<1分的答案,INT / INT是不够的。 INT / INT确实整数除法。尝试铸造整型的中的一个来操作内部的双
在我的情况下没有什么上述工作。
我想要做的是575除以278乘以100找到百分比。
double p = (double)((PeopleCount * 1.0 / AllPeopleCount * 1.0) * 100.0);
%:48,3478260869565 - >五百七十五分之二百七十八---> 0 %:51,6521739130435 - >五百七十五分之二百九十七---> 0
如果我由1.0乘以PeopleCount它使小数和除法将48.34 ... 也由100.0不乘以100。
标记为这样的答案很接近,但我认为这是值得补充说,有采用双和小数之间的差异。
我不会做一个更好的工作比解释维基百科的概念,所以我将只提供指针:
在金融系统,通常的情况是,我们可以保证一定的数量(以10为底)的小数位精确度的要求。这是,如果输入/源数据是在基10通常不可能的,但我们执行在基数为2的运算(因为对于一个数的小数膨胀所需的小数位的数目取决于在底座上;三分之一需要无限多的小数地在碱-10表达为0.333333 ...,但它需要仅一个小数在碱-3:0.1)。
浮点数更快一起工作(在CPU时间范围;编程明智它们同样简单),每当你希望尽量减少舍入误差(如在科学应用)优选的。