为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉丁的传说 2019-05-30 16:11:42
为什么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'严格地说,不存在整数除法(按定义除法是产生有理数的运算,整数是其中的一个很小的子集)。

4 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

虽然新程序员在实际使用浮点除法时会犯执行整数除法的错误,但在实际操作中,整数除法是一种非常常见的操作。如果你假设人们很少使用它,而且每次你进行除法时,你总是需要记住把它转换成浮点数,那么你就错了。

首先,整数除法要快得多,所以如果你只需要一个整数的结果,你就会想要使用更高效的算法。

其次,有许多算法使用整数除法,如果除法的结果总是浮点数,那么每次都会被迫舍入结果。我头顶上的一个例子就是改变了一个数字的基数。计算每一位数涉及一个数字与剩余数的整数除法,而不是数字的浮点数除法。

由于这些(和其他相关的)原因,整数除法导致整数。如果要获得两个整数的浮点除法,只需记住将一个转换为double/float/decimal.


查看完整回答
反对 回复 2019-05-30
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

见C#规格。有三种类型的除法操作符。

  • 整数除法
  • 浮点除法
  • 十进制除法

在您的情况下,我们有Integer部门,适用以下规则:

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

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


查看完整回答
反对 回复 2019-05-30
?
SMILET

TA贡献1796条经验 获得超4个赞

每个数据类型都能够重载每个操作符。如果分子和分母都是整数,则整数类型将执行除法操作,并返回整数类型。如果要进行浮点除法,则必须先将一个或多个数字转换为浮点数类型,然后再对其进行分割。例如:

int x = 13;int y = 4;float x = (float)y / (float)z;

或者,如果您使用的是文字:

float x = 13f / 4f;

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


查看完整回答
反对 回复 2019-05-30
?
FFIVE

TA贡献1797条经验 获得超6个赞

因为你不使用任何后缀,所以文字134被解释为整数:

手册:

如果文字没有后缀,它的第一个类型可以表示其值:intuintlongulong.

因此,既然您声明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后缀(13f4f).


查看完整回答
反对 回复 2019-05-30

添加回答

代码语言

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信