Round

四捨五入(VB6.0とSQL)

「(単価)×(個数)」を四捨五入したものの合計が欲しいのです。

ところが。
SQL = "SELECT COUNT(*),SUM(ROUND(TO_NUMBER(UNITPRICE) * TO_NUMBER(AMOUNT))) FROM PARTS_INFO"
の結果と、
SQL = "SELECT UNITPRICE, AMOUNT FROM PARTS_INFO"
の結果をそれぞれ、UnitPrice()、Amount()に格納し

For I = 0 To RecodeNum - 1
	Price = Round(Val(UnitPrice(I)) * Val(Amount(I)))
	TotalPrice = TotalPrice + Price
Next
としたときのTotalPriceの値に誤差がありました。

んー?と思い調べたところ、SQLのほうのROUND関数はまさに「四捨五入」。
でもVBのほうは四捨五入ではなく、いわゆる銀行丸めと呼ばれる方式だったのですね。
(「"銀行型" の丸め処理の場合は ".5" は、結果が偶数になるように丸め処理が行われ、切り上げられることも、切り捨てられることもあります。」とのこと。)


   Format("0.5","##0")      ' 0
   Format("1.5","##0")      ' 2
   Format("2.5","##0")      ' 2
   Format("3.5","##0")      ' 4

Formatの例がたくさん出てましたけど、Roundもそうだったんですねぇ。
まあ、確かにちゃんと「丸め関数」って書いてあるのに「四捨五入の関数」と思い込んで使った私がお馬鹿なんですけれども。
Formatも今まで表示用に書式を整えるのにしか使ってなかったので知りませんでしたわ。
なんか、OSとかSP、VBのバージョンによっても動作は違うようなので、要注意ですな。