为什么将两个32位的整数除以(int/int)返回给我 0,但是如果我使用 Decimal.Divide(),我会得到正确的答案?我绝对不是 C # 的人。
0
Decimal.Divide()
int是一个整数类型; 除以两个整数将执行 整数除法,即小数部分被截断,因为它不能存储在结果类型中(也是 int!).相比之下,Decimal只有一个小部分。通过调用 Decimal.Divide,您的 int参数被隐式转换为 Decimal。
int
Decimal
Decimal.Divide
通过显式地将至少一个参数强制转换为浮点类型,可以对 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
Decimal.Divide(decimal, decimal)
在第一种情况下,您正在进行整数除法,因此结果被截断(小数部分被截断)并返回一个整数。
在第二种情况下,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。