VB.NET中的除法運(yùn)算符有兩個(gè):/(浮點(diǎn)除法)、\(整數(shù)除法)
C#中的除法運(yùn)算符只有一個(gè):/(除法)
VB.NET中的除法運(yùn)算符與C#中的除法運(yùn)算符存在很大的差異,使用時(shí)注意區(qū)分。
關(guān)于C#中的除法運(yùn)算符的介紹(摘自MSDN):
/(除法): 將兩個(gè)數(shù)相除并返回除數(shù)和被除數(shù)的數(shù)據(jù)類型中精度高的數(shù)據(jù)類型。
執(zhí)行除法前,編譯器會(huì)將除數(shù)和被除數(shù)的數(shù)據(jù)類型統(tǒng)一成兩者類型中精度高的數(shù)據(jù)類型。返回的運(yùn)算結(jié)果的類型也是兩者類型中精度高的數(shù)據(jù)類型。例如:兩個(gè)整數(shù)相除的結(jié)果始終為一個(gè)整數(shù)。 一個(gè)整數(shù)和一個(gè)Double型相除,返回結(jié)果為Double型。但是需要注意一點(diǎn),Double和Decimal不能直接進(jìn)行算術(shù)運(yùn)算,必須先顯式的將兩者類型進(jìn)行統(tǒng)一,之后才能進(jìn)行運(yùn)算,Double和Decimal不能直接進(jìn)行運(yùn)算的原因是兩者之間不能進(jìn)行隱式的類型轉(zhuǎn)換。
除法運(yùn)算符 (/) 用第二個(gè)操作數(shù)除第一個(gè)操作數(shù)。所有數(shù)值類型都具有預(yù)定義的除法運(yùn)算符。
using System;
class MainClass
{
static void Main()
{
Console.WriteLine(-5/2);
Console.WriteLine(-5.0/2);
}}
關(guān)于VB.NET中的除法運(yùn)算符的介紹(摘自MSDN):
/(浮點(diǎn)除法):將兩個(gè)數(shù)相除并返回以浮點(diǎn)數(shù)表示的結(jié)果。
所得結(jié)果的數(shù)據(jù)類型取決于操作數(shù)的類型。 下表顯示如何確定結(jié)果的數(shù)據(jù)類型。
操作數(shù)數(shù)據(jù)類型 | 結(jié)果數(shù)據(jù)類型 |
兩個(gè)表達(dá)式都是整數(shù)數(shù)據(jù)類型(SByte、Byte、Short、UShort、Integer、UInteger、Long、ULong) | Double |
一個(gè)表達(dá)式為 Single 數(shù)據(jù)類型,而另一個(gè)表達(dá)式不為 Double | Single |
一個(gè)表達(dá)式為 Decimal 數(shù)據(jù)類型,而另一個(gè)表達(dá)式不為 Single 或 Double | Decimal |
任一表達(dá)式為 Double 數(shù)據(jù)類型 | Double |
執(zhí)行除法之前,任何整數(shù)數(shù)值表達(dá)式都會(huì)被擴(kuò)展為 Double。 如果將結(jié)果賦給整數(shù)數(shù)據(jù)類型,Visual Basic 會(huì)嘗試將結(jié)果從 Double 轉(zhuǎn)換成這種類型。 如果結(jié)果不適合該類型,會(huì)引發(fā)異常。如果除數(shù)或被除數(shù)計(jì)算結(jié)果等于 Nothing,則將其視為零。
\(整數(shù)除法):將兩個(gè)數(shù)相除并返回以整數(shù)形式表示的結(jié)果。
下表如何確定結(jié)果的數(shù)據(jù)類型。 請(qǐng)注意,此表是對(duì)稱的;對(duì)于給定的操作數(shù)數(shù)據(jù)類型組合,無(wú)論操作數(shù)的順序如何,結(jié)果數(shù)據(jù)類型都是相同的。
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 |
如果 \ 運(yùn)算符兩個(gè)操作數(shù)中的任何一個(gè)為 Decimal、Single 或 Double,則 Visual Basic 在運(yùn)算前會(huì)嘗試將其轉(zhuǎn)換為 Long,并且運(yùn)算的結(jié)果數(shù)據(jù)類型為 Long。如果 Option Strict 為 On,將產(chǎn)生編譯器錯(cuò)誤。 如果 Option Strict 為 Off,若值超出 Long 數(shù)據(jù)類型 (Visual Basic) 的范圍,則可能會(huì)產(chǎn)生 OverflowException。 轉(zhuǎn)換為 Long 也服從“四舍六入五成雙”。如果除數(shù)或被除數(shù)計(jì)算結(jié)果等于 Nothing,則將其視為零。
一、“/”運(yùn)算符:
C#中默認(rèn)的“/”是取整除法(不四舍五入)。譬如C#中1/2默認(rèn)返回一個(gè)整數(shù)0.
但是VB.NET中“/”返回一個(gè)Double類型的數(shù)值(相當(dāng)于C#中1.0/2的效果)。
在做這類運(yùn)算時(shí)候,VB.NET會(huì)把被除數(shù)和除數(shù)提升到Double類型,因此1/0在VB.NET不是錯(cuò)誤(因?yàn)檫@個(gè)表達(dá)式被解析成:1/CDbl(0))。結(jié)果CDbl(0)是一個(gè)接近于0的,但不是等于0的浮點(diǎn)數(shù)(可以理解為“正無(wú)窮小”),那么結(jié)果是“正無(wú)窮大”。但C#在做"/"時(shí)候,由于兩個(gè)都是整數(shù),因此直接做整數(shù)相除,拋出異常(如果嘗試在C#中1.0/0,可以得到和VB.NET中一樣的結(jié)論)。
二、“\”運(yùn)算符:
這是VB.NET獨(dú)有的,和C#的“/”一致。值得注意的是如果雙方有一個(gè)浮點(diǎn)數(shù),取整結(jié)果默認(rèn)轉(zhuǎn)化為L(zhǎng)ong(Int64)。此時(shí)1\0會(huì)發(fā)生錯(cuò)誤。
三、取余運(yùn)算:
C#中是“%”,VB.NET是Mod,類型按照實(shí)際結(jié)果決定。