忍者ブログ

2024-11-23(Sat)

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2010-10-25(Mon)

Access VBAで小数点以下○位を切り捨て

かつて、AccessのRound関数は、厳密には四捨五入じゃないと紹介しました。
さて、今度はAccessVBAでの切り捨てのお話。

よく、仕様で小数点第○位で切り捨てなんてことが書かれています。
COBOLのときは、9V99999...に送ってやると切り捨てられたものですが、
(切り捨てられましたよね。たぶん・・・・)
VBAではどうやるのだろう??

その答えです。

拍手[0回]

簡単に言うと、Fix関数を使います。

たとえば、小数点13位で切り捨てをやってみましょう。

Dim A As Double
Dim B As Double
Dim C As Double

A = 8
B = 9

C=A/B
では、0.8888888888888888・・・・のはずです。
これをCOBOLの感覚で、
C = Val(Format(A / B, "0.0000000000000"))でやってしまうと、
0.8888888888889となってしまいます。
(そんなやつはいない?でも、最初やってしまったのです。私は・・・)

で、どうするか。先ほど書いたFix関数で

 C = Fix((A/B) * 10000000000000#) / 10000000000000#
(#は勝手についてしまう。何の意味?)

で、結果は
0.8888888888888
となるはず。

で、ついでに小数点以下切り捨てする場合。
COBOLの感覚で、
Dim A As Double
Dim B As Double
Dim C As Integer

A = 8
B = 9

C=A/B

とやってしまうと、
1
になってしまいます。
そうです。勝手に丸められるのですね。

やはりこの場合もFix関数を使って
C= Fix(A / B)

としなくてはいけません。
結果は 0となるはずです。

まだCOBOLの感覚が抜けきれない私でした・・・・。




PR

この記事にコメントする

Name
Title
Mail
URL
Comment
Pass
Pictgram
Vodafone絵文字 i-mode絵文字 Ezweb絵文字

・・・

2010-10-27 20:58

 ボケている人にはツッコンであげるのが親切というもの
ツッコンでほしいからこのような”ネタ”を提供してくれているのでしょう。

気になるのが”Double”です。
これ本気で使っていないですよね?
事務処理では絶対に使いませんので

たとえば

Dim a As Double
Dim b As Double
Dim c As Double
Dim d As Double

a = 0.5
b = 0.4
c = 0.1
d = a - b - c

このような計算すると、答えは 0 になるはずが
d=-2.77555756156289E-17
こんなん出ました!

また

Dim e As Double

e = 0.1 - 1 / 10

これも 0 になるはずが
e=5.54975987041018E-18
こうなります。

普通はCurrency使います
さらに使おうと思えばDecimalも使えます

Dim a1 As Variant
Dim b1 As Variant
Dim c1 As Variant
Dim d1 As Variant
Dim e1 As Variant


a1 = CDec(0.5)
b1 = CDec(0.4)
c1 = CDec(0.1)
d1 = a1 - b1 - c1
e1 = 0.1 - CDec(1 / 10)

結果は
d1=0
e1=0
となります。

DecimalはVariant型の中にしか存在できませんが
扱える桁が多いので重宝します。


Public Function RoundDown(ByVal numNumber As Variant, _
Optional ByVal decplc As Long = 0) As Variant
Dim decdecplc As Variant
Dim decNumber As Variant
Dim temp As Variant

decNumber = CDec(numNumber)
decdecplc = CDec(10 ^ decplc)
temp = CDec(Fix(decNumber * decdecplc))
RoundDown = temp / decdecplc

End Function

このような関数を用意しておき

RoundDown(cdec(8)/cdec(9),27)
と計算させると
=0.888888888888888888888888888
結果はこうなります。

Re:・・・

2010-10-28 00:10

ふふふ。さすがですね。
ただし、DecimalはAccess2000以降。それ以前は使えなかったと認識しています。
かつ、テーブルには定義できるが、VBAではVariantでしか使えないということで、一般(というより、このブログを見るのはやはりこの道が多い?)の方にはなじみが薄いかなと。
ただ、COBOLをしていた人間にとっては、やはりDecimalは重宝します。

この記事へのトラックバック

この記事にトラックバックする

Amazon

PR

情報サービス

楽天

ソフト関連

メーカー直販PC

周辺機器

ランキング

プロフィール

HN:
NORI
性別:
男性
趣味:
車でどこへでも
自己紹介:
文学部卒業ながら、ひょんなことからシステム会社に就職。
しかしながらあまりの激務に退職。もうシステム系はいやだと思っていたが、ひょんなことから企業の電算室に勤務することとなる。

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

ブログ内検索

Google
Web ブログ内

最新TB

アクセス解析