为什么C#中的整数除法返回整数而不是浮点?

为什么C#中的整数除法返回整数而不是浮点?,c#,division,C#,Division,有人知道为什么C#中的整数除法返回整数而不是浮点吗? 背后的想法是什么?(这只是C/C++的一个遗产吗?) 在C#中: 该代码的结果将是: 'Hello world' 严格地说,没有整数除法(定义除法是一种产生有理数的运算,整数是其中的一个很小的子集。)参见C。有三种类型的除法运算符 整数除法 浮点除法 十进制除法 在您的情况下,我们使用整数除法,并应用以下规则: 除法将结果四舍五入为零,并将 结果是可能的最大整数,该整数小于 两个操作数商的绝对值。结果是零 当两个操作数的符号相同且为零或

有人知道为什么C#中的整数除法返回整数而不是浮点吗? 背后的想法是什么?(这只是C/C++的一个遗产吗?)

在C#中:

该代码的结果将是:

'Hello world'
严格地说,没有整数除法(定义除法是一种产生有理数的运算,整数是其中的一个很小的子集。)

参见C。有三种类型的除法运算符

  • 整数除法
  • 浮点除法
  • 十进制除法
在您的情况下,我们使用整数除法,并应用以下规则:

除法将结果四舍五入为零,并将 结果是可能的最大整数,该整数小于 两个操作数商的绝对值。结果是零 当两个操作数的符号相同且为零或时为正 两个操作数的符号相反时为负数


我认为C#使用这种整型除法(某些语言返回浮点结果)的原因是硬件-整型除法更快、更简单。

因为不使用任何后缀,所以文本
13
4
被解释为整数:

:

如果文本没有后缀,则它具有可以表示其值的第一种类型:
int
uint
long
ulong

因此,由于您将
13
声明为整数,因此将执行整数除法:

:

对于形式为x/y的操作,应用二进制运算符重载解析来选择特定的运算符实现。操作数转换为所选运算符的参数类型,结果类型为运算符的返回类型

下面列出了预定义的除法运算符。这些运算符都计算x和y的商

整数除法:

int operator /(int x, int y);
uint operator /(uint x, uint y);
long operator /(long x, long y);
ulong operator /(ulong x, ulong y);
于是四舍五入发生了:

除法将结果向零舍入,结果的绝对值是可能的最大整数,该整数小于两个操作数商的绝对值。当两个操作数的符号相同时,结果为零或正;当两个操作数的符号相反时,结果为零或负

如果您执行以下操作:

int x = 13f / 4f;
您将收到一个编译器错误,因为浮点除法(
13f
/
运算符)会导致浮点,而浮点不能隐式转换为int

如果希望除法为浮点除法,则必须将结果设为浮点:

float x = 13 / 4;

请注意,您仍将对整数进行除法,这将隐式转换为浮点:结果将是
3.0
。要将操作数显式声明为浮点,请使用
f
后缀(
13f
4f
)。

每个数据类型都可以重载每个运算符。如果分子和分母都是整数,整数类型将执行除法运算,并返回整数类型。如果要进行浮点除法,则必须在除法之前将一个或多个数字类型转换为浮点类型。例如:

int x = 13;
int y = 4;
float x = (float)y / (float)z;
或者,如果您使用的是文字:

float x = 13f / 4f;

请记住,浮点不是精确的。如果您关心精度,请使用类似于decimal类型的内容

虽然新程序员在实际打算使用浮点除法时经常犯这种执行整数除法的错误,但在实际操作中,整数除法是一种非常常见的操作。如果您假设人们很少使用它,并且每次除法时都需要记住转换为浮点,那么您就错了

首先,整数除法要快一点,所以如果你只需要一个整数的结果,你会希望使用更高效的算法

其次,有许多算法使用整数除法,如果除法的结果总是一个浮点数,那么每次都会强制对结果进行四舍五入。我脑海中的一个例子是改变数字的基数。计算每个数字时,需要对数字进行整数除法和余数除法,而不是对数字进行浮点除法


由于这些(以及其他相关)原因,整数除法产生整数。如果你想得到两个整数的浮点除法,你只需要记住将一个除法转换成一个
双精度
/
浮点
/
十进制
这只是一个基本运算。

还记得你学过分割吗。开始时,我们用余数3求解了
9/6=1

9 / 6 == 1  //true
9 % 6 == 3 // true
/-运算符与%-运算符组合用于检索这些值

可能有用:

double a = 5.0/2.0;   
Console.WriteLine (a);      // 2.5

double b = 5/2;   
Console.WriteLine (b);      // 2

int c = 5/2;   
Console.WriteLine (c);      // 2

double d = 5f/2f;   
Console.WriteLine (d);      // 2.5

结果将始终是分子和分母范围较大的类型。异常是byte和short,它们产生int(Int32)


浮点类型和十进制类型之间没有隐式转换,因此不允许在它们之间进行除法。您必须显式强制转换并决定要使用哪种类型(与浮点类型相比,Decimal具有更高的精度和更小的范围)。

作为了解所获得内容的小技巧,您可以使用var,因此编译器将告诉您期望的类型:

int a = 1;
int b = 2;
var result = a/b;

编译器会告诉您这里的结果是int类型。

因为它是
整数
除法而不是
浮点
除法。它必须(在VB.Net中)它是以一种自然的数学方式实现的,所有除法运算的结果都是一个无理数。我想你指的是有理数。请参阅:除以两个整数可能会得到一个余数。完成re的划分
var a = (byte)5 / (byte)2;  // 2 (Int32)
var b = (short)5 / (byte)2; // 2 (Int32)
var c = 5 / 2;              // 2 (Int32)
var d = 5 / 2U;             // 2 (UInt32)
var e = 5L / 2U;            // 2 (Int64)
var f = 5L / 2UL;           // 2 (UInt64)
var g = 5F / 2UL;           // 2.5 (Single/float)
var h = 5F / 2D;            // 2.5 (Double)
var i = 5.0 / 2F;           // 2.5 (Double)
var j = 5M / 2;             // 2.5 (Decimal)
var k = 5M / 2F;            // Not allowed
int a = 1;
int b = 2;
var result = a/b;