C#中的积分和浮点运算有什么区别?
我尝试在网上查找和阅读文章,但并没有直接回答问题。
答案 0 :(得分:2)
几个算术运算符受整数和浮点逻辑的影响。使人绊倒的最常见的是divisor operator
整数除法
对于整数类型的操作数,/运算符的结果为整数类型,并且等于两个操作数的四舍五入到零的商:
浮点除法
对于浮点,双精度和十进制类型,/运算符的结果是两个操作数的商:
下面显示一个示例。
var intResult = 5/2; //result is 2, not 2.5
var doubleResult = 5/2.0; //result is 2.5
受整数与浮点逻辑影响的其他项目如下
整数余量
对于整数类型的操作数,%b的结果是a-(a / b)* b产生的值。非零余数的符号与第一个操作数的符号相同...
浮点余数
对于浮点和双精度操作数,有限x和y的x%y的结果是z使得
- z的符号(如果非零)与x的符号相同。
- z的绝对值是| x |产生的值。 -n * | y |其中n是小于或等于| x |的最大可能整数。 / | y |和| x |和| y |分别是x和y的绝对值。
remainder运算符只为整数和浮点运算生成一个余数。浮点余数的描述仅是更具描述性的,因为它对浮点值进行操作。示例如下所示
Console.WriteLine(5 % 4); // output: 1
Console.WriteLine(5 % -4); // output: 1
Console.WriteLine(-5 % 4); // output: -1
Console.WriteLine(-5 % -4); // output: -1
Console.WriteLine(-5.2f % 2.0f); // output: -1.2
Console.WriteLine(5.9 % 3.1); // output: 2.8
Console.WriteLine(5.9m % 3.1m); // output: 2.8
另一个示例只是为了说明整数余数和浮点余数是相同的。唯一的区别是一个返回一个int,另一个返回一个double。
Console.WriteLine(5.0 % 4.0); // output: 1.0
arithmetic overflow and divide by zero
整数算术溢出
整数除以零总是抛出
DivideByZeroException
。在整数算术溢出的情况下,可以检查还是不检查溢出检查上下文来控制结果:
- 在检查的上下文中,如果常量表达式中发生溢出,则会发生编译时错误。否则,在运行时执行该操作时,将抛出
OverflowException
。- 在未检查的上下文中,结果将被舍弃,方法是丢弃任何不适合目标类型的高阶位。 连同checked和unchecked语句,您可以使用checked和unchecked运算符来控制溢出检查上下文,在该上下文中对表达式进行求值:
int a = int.MaxValue;
int b = 3;
Console.WriteLine(unchecked(a + b)); // output: -2147483646
try
{
int d = checked(a + b);
}
catch(OverflowException)
{
Console.WriteLine($"Overflow occured when adding {a} to {b}.");
}
浮点算术溢出
使用
float
和double
类型的算术运算永远不会引发异常。这些类型的算术运算结果可以是表示无穷且不是数字的特殊值之一:
double a = 1.0 / 0.0;
Console.WriteLine(a); // output: Infinity
Console.WriteLine(double.IsInfinity(a)); // output: True
Console.WriteLine(double.MaxValue + double.MaxValue); // output: Infinity
double b = 0.0 / 0.0;
Console.WriteLine(b); // output: NaN
Console.WriteLine(double.IsNaN(b)); // output: True
基本上,int
会抛出溢出异常,具体取决于您是否检查溢出,并且总是抛出被零除的异常。浮点值不会溢出,而是采用特殊的无穷大值,或者在某些情况下不是数字(NaN)
几乎每种编程语言都存在这些差异,但是具体处理方式可能有所不同。