


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