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