VB.NET中的除法运算符有两个:/(浮点除法)、\(整数除法)
C#中的除法运算符只有一个:/(除法)
VB.NET中的除法运算符与C#中的除法运算符存在很大的差异,使用时注意区分。
关于C#中的除法运算符的介绍(摘自MSDN):
/(除法): 将两个数相除并返回除数和被除数的数据类型中精度高的数据类型。
执行除法前,编译器会将除数和被除数的数据类型统一成两者类型中精度高的数据类型。返回的运算结果的类型也是两者类型中精度高的数据类型。例如:两个整数相除的结果始终为一个整数。 一个整数和一个Double型相除,返回结果为Double型。但是需要注意一点,Double和Decimal不能直接进行算术运算,必须先显式的将两者类型进行统一,之后才能进行运算,Double和Decimal不能直接进行运算的原因是两者之间不能进行隐式的类型转换。
除法运算符 (/) 用第二个操作数除第一个操作数。所有数值类型都具有预定义的除法运算符。
using System;
class MainClass
{
static void Main()
{
Console.WriteLine(-5/2);
Console.WriteLine(-5.0/2);
}}
关于VB.NET中的除法运算符的介绍(摘自MSDN):
/(浮点除法):将两个数相除并返回以浮点数表示的结果。
所得结果的数据类型取决于操作数的类型。 下表显示如何确定结果的数据类型。
操作数数据类型 | 结果数据类型 |
两个表达式都是整数数据类型(SByte、Byte、Short、UShort、Integer、UInteger、Long、ULong) | Double |
一个表达式为 Single 数据类型,而另一个表达式不为 Double | Single |
一个表达式为 Decimal 数据类型,而另一个表达式不为 Single 或 Double | Decimal |
任一表达式为 Double 数据类型 | Double |
执行除法之前,任何整数数值表达式都会被扩展为 Double。 如果将结果赋给整数数据类型,Visual Basic 会尝试将结果从 Double 转换成这种类型。 如果结果不适合该类型,会引发异常。如果除数或被除数计算结果等于 Nothing,则将其视为零。
\(整数除法):将两个数相除并返回以整数形式表示的结果。
下表如何确定结果的数据类型。 请注意,此表是对称的;对于给定的操作数数据类型组合,无论操作数的顺序如何,结果数据类型都是相同的。
Boolean | SByte | Byte | Short | UShort | Integer | UInteger | Long | ULong | |
Boolean | Boolean | SByte | Short | Short | Integer | Integer | Long | Long | Long |
SByte | SByte | SByte | Short | Short | Integer | Integer | Long | Long | Long |
Byte | Short | Short | Byte | Short | UShort | Integer | UInteger | Long | ULong |
Short | Short | Short | Short | Short | Integer | Integer | Long | Long | Long |
UShort | Integer | Integer | UShort | Integer | UShort | Integer | UInteger | Long | ULong |
Integer | Integer | Integer | Integer | Integer | Integer | Integer | Long | Long | Long |
UInteger | Long | Long | UInteger | Long | UInteger | Long | UInteger | Long | ULong |
Long | Long | Long | Long | Long | Long | Long | Long | Long | Long |
ULong | Long | Long | ULong | Long | ULong | Long | ULong | Long | ULong |
如果 \ 运算符两个操作数中的任何一个为 Decimal、Single 或 Double,则 Visual Basic 在运算前会尝试将其转换为 Long,并且运算的结果数据类型为 Long。如果 Option Strict 为 On,将产生编译器错误。 如果 Option Strict 为 Off,若值超出 Long 数据类型 (Visual Basic) 的范围,则可能会产生 OverflowException。 转换为 Long 也服从“四舍六入五成双”。如果除数或被除数计算结果等于 Nothing,则将其视为零。
一、“/”运算符:
C#中默认的“/”是取整除法(不四舍五入)。譬如C#中1/2默认返回一个整数0.
但是VB.NET中“/”返回一个Double类型的数值(相当于C#中1.0/2的效果)。
在做这类运算时候,VB.NET会把被除数和除数提升到Double类型,因此1/0在VB.NET不是错误(因为这个表达式被解析成:1/CDbl(0))。结果CDbl(0)是一个接近于0的,但不是等于0的浮点数(可以理解为“正无穷小”),那么结果是“正无穷大”。但C#在做"/"时候,由于两个都是整数,因此直接做整数相除,抛出异常(如果尝试在C#中1.0/0,可以得到和VB.NET中一样的结论)。
二、“\”运算符:
这是VB.NET独有的,和C#的“/”一致。值得注意的是如果双方有一个浮点数,取整结果默认转化为Long(Int64)。此时1\0会发生错误。
三、取余运算:
C#中是“%”,VB.NET是Mod,类型按照实际结果决定。