忍者ブログ

2024-04-25(Thu)

[PR]

×

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

2009-07-20(Mon)

AccessのRoundは四捨五入じゃない

Accessを使っていて、小数点以下を四捨五入して整数で表示することはよくあると思います。
そこでよく使われているのが、Round関数。

Accessのヘルプにもこう書かれています(2007の場合)


小数点以下の指定された桁以下を四捨五入した数値を返します。

構文

Round(expression [, numdecimalplaces ] )

Round 関数には、次の引数があります。

引数 説明
expression 必ず指定します。四捨五入を行う(数式 : 数値で評価する式です。数式は、変数、定数、関数、および演算子を任意に組み合わせて指定できます。)を指定します。
numdecimalplaces 省略可能です。四捨五入する小数点以下の桁数を表す数値を指定します。省略すると、最も近い整数に丸められます。


でも、実際にやってみると違うんですよねぇ・・・

拍手[2回]

で、実際にやってみます。
まず、[テーブル1]を作成し、フィールド[数字]とします。
[数字]のデータ型は数値型で、データサイズを倍精度浮動小数点型を選択します。

で、以下のようにデータを入力します。
テーブル1
数字
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
2
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
3
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1

次に、クエリー1を作成します。
選択するテーブルは、さきほどの、「テーブル1」。フィールドは、「テーブル1」の「数字」と、その横のフィールドに、Round関数を使ったフィールドを作ります。
Round: Round([テーブル1].[数字])
で、実行してみると・・・・


クエリ1
数字 Round
0.1 0
0.2 0
0.3 0
0.4 0
0.5 0
0.6 1
0.7 1
0.8 1
0.9 1
1 1
1.1 1
1.2 1
1.3 1
1.4 1
1.5 2
1.6 2
1.7 2
1.8 2
1.9 2
2 2
2.1 2
2.2 2
2.3 2
2.4 2
2.5 2
2.6 3
2.7 3
2.8 3
2.9 3
3 3

あれあれ?ですよね。0.5の小数点以下を四捨五入すると1のはずですし、2.5の場合は3のはず・・・。
でも、切り捨てられています。でも、1.5はちゃんと2になっている。
引数をいれたらどうなるか?
Round: Round([テーブル1].[数字],0) とやっても同じ結果でした。
なぜそうなるかは私はわからなかったのですが、こちらで詳しく説明されています。
(ITコンサルタント 市井賢児のメモ

あれはあれであっているということですが、だったらヘルプの「四捨五入」という書き方はやめてもらいたいものです。

では、小数点以下を四捨五入し整数値にしたい場合はどうするのか?
さきほどのクエリーに次のフィールドを追加します。
Int: Int([テーブル1].[数字]+0.5)

で、結果はこちら
クエリ1
数字 Round Int
0.1 0 0
0.2 0 0
0.3 0 0
0.4 0 0
0.5 0 1
0.6 1 1
0.7 1 1
0.8 1 1
0.9 1 1
1 1 1
1.1 1 1
1.2 1 1
1.3 1 1
1.4 1 1
1.5 2 2
1.6 2 2
1.7 2 2
1.8 2 2
1.9 2 2
2 2 2
2.1 2 2
2.2 2 2
2.3 2 2
2.4 2 2
2.5 2 3
2.6 3 3
2.7 3 3
2.8 3 3
2.9 3 3
3 3 3

この、0.5を足すやりかたはよくCOBOLでもやるので私としてはこちらのほうがしっくりきます。
(ちなみに切り上げは0.9を足す)

じゃぁ、Excelは?よく、四捨五入するにはRound使いなさいと教えているが・・・・。
数字セルの横に、=Round(A2,0)という数式を入れて、あとはコピー・・・・。
結果はこうなりました。

数字 Round
0.1 0
0.2 0
0.3 0
0.4 0
0.5 1
0.6 1
0.7 1
0.8 1
0.9 1
1 1
1.1 1
1.2 1
1.3 1
1.4 1
1.5 2
1.6 2
1.7 2
1.8 2
1.9 2
2 2
2.1 2
2.2 2
2.3 2
2.4 2
2.5 3
2.6 3
2.7 3
2.8 3
2.9 3
3 3

ん?四捨五入されている・・・。
AccessのRound関数と、ExcelのRound関数は違うのか??

謎は深まるばかりです・・・・。

え?じゃぁ、VBは? VB6で試してみます。

Private Sub Command1_Click()
Dim A As Double
Dim B As Double

A = 0

Do Until A > 3
 A = A + 0.1
 B = Round(A, 0)
 
 Text1.Text = Text1.Text + Format(A, "0.0") + "   " + Format(B, "0.0") + vbCrLf
Loop


End Sub

で、結果は
数字 Round
0.1   0.0
0.2   0.0
0.3   0.0
0.4   0.0
0.5   0.0
0.6   1.0
0.7   1.0
0.8   1.0
0.9   1.0
1.0   1.0
1.1   1.0
1.2   1.0
1.3   1.0
1.4   1.0
1.5   2.0
1.6   2.0
1.7   2.0
1.8   2.0
1.9   2.0
2.0   2.0
2.1   2.0
2.2   2.0
2.3   2.0
2.4   2.0
2.5   3.0
2.6   3.0
2.7   3.0
2.8   3.0
2.9   3.0
3.0   3.0

うーん・・・・。謎は深まるばかりです。


PR

この記事にコメントする

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

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

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

Amazon

PR

情報サービス

楽天

ソフト関連

メーカー直販PC

周辺機器

ランキング

プロフィール

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

カレンダー

03 2024/04 05
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

アクセス解析