


摘 要 本文分析了MSSql數(shù)據(jù)庫(kù)除法運(yùn)算結(jié)果,指出MSSql數(shù)據(jù)庫(kù)一個(gè)整數(shù)除以另一個(gè)整數(shù),結(jié)果只保留整數(shù),小數(shù)部分被舍去,不是通常意義上的除法,概念表達(dá)與實(shí)際結(jié)果名實(shí)不符,并就此提出了改進(jìn)建議。
關(guān)鍵詞 MSSql數(shù)據(jù)庫(kù);除法;運(yùn)算;結(jié)果;改進(jìn);建議
1問題的提出
2/4等于幾?3/2等于幾?這是個(gè)小學(xué)算術(shù)問題,答案很簡(jiǎn)單, 2/4=0.5, 3/2=1.5,但是,在MSSql數(shù)據(jù)庫(kù),你會(huì)感到很奇怪!2/4=0,3/2=1,這是為什么?
首先看一個(gè)示例,圖1,在MSSql數(shù)據(jù)庫(kù):
(腳本在MSSql2000,2005,2012調(diào)試通過)
是不是感到奇怪,運(yùn)算結(jié)果怎么沒有小數(shù)呢?.5去哪里了?
2問題的解釋
通過查閱MSSql數(shù)據(jù)庫(kù)聯(lián)機(jī)幫助我們可知, MSSql算術(shù)運(yùn)算符除法之結(jié)果返回優(yōu)先級(jí)較高的參數(shù)的數(shù)據(jù)類型,如果用一個(gè)整數(shù)除以另一個(gè)整數(shù),其結(jié)果是一個(gè)整數(shù),小數(shù)部分被截?cái)啵簿褪钦f,在MSSql數(shù)據(jù)庫(kù), 一個(gè)整數(shù)除以另一個(gè)整數(shù),其結(jié)果是小數(shù)部分被舍去,只要整數(shù)結(jié)果,所以,在MSSql數(shù)據(jù)庫(kù)平臺(tái),2/3=0,3/2=1[1]。但不是兩個(gè)整數(shù)相除呢?我們看一個(gè)示例,如圖2:
(腳本在MSSql2000,2005,2012調(diào)試通過)
因?yàn)閒loat優(yōu)先級(jí)高于INT,那么,除法結(jié)果就返回float,小數(shù)部分沒有被截?cái)?,能看到大家所熟悉的除法運(yùn)算結(jié)果。
由上所述可知,在MSSql數(shù)據(jù)庫(kù),一個(gè)整數(shù)除以另一個(gè)整數(shù),其結(jié)果是一個(gè)整數(shù),小數(shù)部分被舍去,和通常的除法不一樣,但MSSql數(shù)據(jù)庫(kù)的整數(shù)與其它非整形數(shù)(如float)進(jìn)行除或被除運(yùn)算,運(yùn)算結(jié)果保留小數(shù),和通常的除法一樣。
在MSSql數(shù)據(jù)庫(kù),怎樣實(shí)現(xiàn)兩個(gè)整數(shù)相除返回結(jié)果為大家所熟悉的計(jì)算結(jié)果——帶小數(shù)的結(jié)果呢?
我們看一個(gè)示例:圖3
這個(gè)方法是通過CAST函數(shù)將位于分子(分母)的整形數(shù)強(qiáng)行變換為float,從而實(shí)現(xiàn)了除法結(jié)果保留小數(shù)。
我們?cè)倏匆粋€(gè)示例,如圖4:
(腳本在MSSql2000,2005,2012調(diào)試通過)
這個(gè)方法是通過分子(分母)乘1.0或加0.0的方式,將原整數(shù)強(qiáng)行變?yōu)楦↑c(diǎn)二進(jìn)制,從而實(shí)現(xiàn)了除法結(jié)果保留小數(shù)。
筆者是在編寫機(jī)車乘務(wù)員工作成績(jī)有關(guān)軟件的過程中發(fā)現(xiàn)此問題的,筆者用機(jī)車的往公里除以返公里之結(jié)果作為機(jī)車往、返、還是折返的依據(jù),機(jī)車的往返公里都是整數(shù)且不為零,結(jié)果發(fā)現(xiàn)有的機(jī)車往公里除以返公里之結(jié)果是零,怎么會(huì)是零呢?通過研究MSSql數(shù)據(jù)庫(kù)的除法規(guī)則才發(fā)現(xiàn),在MSSql數(shù)據(jù)庫(kù),一個(gè)整數(shù)除以另一個(gè)整數(shù),運(yùn)算結(jié)果是要截去小數(shù)只保留整數(shù)的,所以,在往公里小于返公里的情況下(分子小于分母),運(yùn)算結(jié)果只保留整數(shù)而要截取小數(shù),所以計(jì)算結(jié)果為零。
為了使往公里除以返公里得到正確結(jié)果,筆者采用了分子(分母)加0.0的方式,強(qiáng)行使分子或分母變?yōu)楦↑c(diǎn)二進(jìn)制,從而使機(jī)車往公里除以返公里得到包含小數(shù)的結(jié)果,便于進(jìn)行機(jī)車往、返、折返的判斷。
3改進(jìn)建議
我們首先研究一下VB.NET有關(guān)除法的具體規(guī)則。
VB.NET有兩個(gè)除法運(yùn)算符。
‘/,通常之除法,返回一個(gè)浮點(diǎn)結(jié)果,例如 2/4=0.5,3/2=1.5。
‘\,整數(shù)除法,返回一個(gè)整數(shù)結(jié)果,截取小數(shù),例如 2/4=0,3/2=1。
通過比較可以發(fā)現(xiàn),MSSql數(shù)據(jù)庫(kù)除法運(yùn)算符只有一個(gè)運(yùn)算符,即‘/運(yùn)算符號(hào),沒有VB.NET整數(shù)除法的運(yùn)算符號(hào)‘\。
由上分析可知,在MSSql數(shù)據(jù)庫(kù),一個(gè)整數(shù)除以另一個(gè)整數(shù),結(jié)果只保留整數(shù),小數(shù)部分被舍去,相當(dāng)于VB.NET的整數(shù)除法操作,不是通常意義上的除法,概念表達(dá)與實(shí)際結(jié)果名實(shí)不符,畢竟除與整除是兩個(gè)不同的概念,建議MSSql數(shù)據(jù)庫(kù)對(duì)此進(jìn)行改進(jìn)。
建議MSSql數(shù)據(jù)庫(kù)對(duì)一個(gè)整數(shù)除以另一個(gè)整數(shù)的運(yùn)算結(jié)果予以改進(jìn),在保留整數(shù)商的基礎(chǔ)上,不再截取小數(shù)(或小數(shù)四舍五入亦可),使除法名實(shí)相符,不再混同于整除操作。
參考文獻(xiàn)
[1] 姚永一.SQL Server數(shù)據(jù)庫(kù)實(shí)用教程[M].北京:電子工業(yè)出版社,2010:59.
作者簡(jiǎn)介
曹殿濤(1962-),男;職稱:高級(jí)工程師、信息系統(tǒng)項(xiàng)目管理師、信息系統(tǒng)集成高級(jí)項(xiàng)目經(jīng)理,現(xiàn)就職單位:國(guó)家鐵路集團(tuán)北京局集團(tuán)有限公司,研究方向:信息技術(shù)在鐵路機(jī)務(wù)系統(tǒng)的應(yīng)用。