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

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

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

在C#中:

float x = 13 / 4;   //imagine I used have an overridden == operator here to use epsilon compareif (x == 3.0)
   print 'Hello world';

这一守则的结果是:

'Hello world'

严格地说,不存在整数除法(按定义除法是产生有理数的运算,整数是其中的一个很小的子集)。


拉丁的传说
浏览 2879回答 4
4回答

Helenr

虽然新程序员在实际使用浮点除法时会犯执行整数除法的错误,但在实际操作中,整数除法是一种非常常见的操作。如果你假设人们很少使用它,而且每次你进行除法时,你总是需要记住把它转换成浮点数,那么你就错了。首先,整数除法要快得多,所以如果你只需要一个整数的结果,你就会想要使用更高效的算法。其次,有许多算法使用整数除法,如果除法的结果总是浮点数,那么每次都会被迫舍入结果。我头顶上的一个例子就是改变了一个数字的基数。计算每一位数涉及一个数字与剩余数的整数除法,而不是数字的浮点数除法。由于这些(和其他相关的)原因,整数除法导致整数。如果要获得两个整数的浮点除法,只需记住将一个转换为double/float/decimal.

阿波罗的战车

见C#规格。有三种类型的除法操作符。整数除法浮点除法十进制除法在您的情况下,我们有Integer部门,适用以下规则:除法将结果舍入为零,结果的绝对值是最大可能的整数,小于两个操作数商的绝对值。当两个操作数有相同的符号时,结果为零或正;当两个操作数有相反的符号时,结果为零或负。我认为C#对整数使用这种类型的除法(某些语言返回浮动结果)的原因是硬件-整数除法更快更简单。

SMILET

每个数据类型都能够重载每个操作符。如果分子和分母都是整数,则整数类型将执行除法操作,并返回整数类型。如果要进行浮点除法,则必须先将一个或多个数字转换为浮点数类型,然后再对其进行分割。例如:int x = 13;int y = 4;float x = (float)y / (float)z;或者,如果您使用的是文字:float x = 13f / 4f;记住,浮点数是不精确的。如果您关心精度,请使用类似十进制类型的内容。

FFIVE

因为你不使用任何后缀,所以文字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).
打开App,查看更多内容
随时随地看视频慕课网APP