Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Access 2010)
整数か否かを判断したい(int関数が思った結果にならない)
投稿日時: 17/08/31 15:51:54
投稿者: 滝沢

「数量÷係数」が整数か否かを判断したいです。
 
クエリ内で「iif([数量]/[係数]=int([数量]/[係数],"○","×")」で判断をしていましたが
下記データの時に、本来は○(整数)なのに×になってしまいました。
数量:98.1
係数:3.27
どうやら「[数量]/[係数]」は「30」なのに「int([数量]/[係数]」が「29」になってしまうようです。
 
なおどちらのフィールドも「倍精度浮動小数点型」ですが、
両方を「単精度浮動小数点型」にすると○になります。
 
何か原因や対策はありますでしょうか。
よろしくお願い致します。

回答
投稿日時: 17/08/31 16:10:09
投稿者: sk

引用:
iif([数量]/[係数]=int([数量]/[係数],"○","×")

IIf(CCur([数量])/CCur([係数])=Int(CCur([数量])/CCur([係数])),"○","×")
 
引用:
なおどちらのフィールドも「倍精度浮動小数点型」ですが、
両方を「単精度浮動小数点型」にすると○になります。

倍精度浮動小数点型も単精度浮動小数点型も、
小数演算において演算誤差が発生し得るデータ型です。
 
MS サポートより:
https://support.microsoft.com/ja-jp/help/410518
https://support.microsoft.com/ja-jp/help/409744

投稿日時: 17/08/31 19:01:48
投稿者: 滝沢

sk様
コメントありがとうございます。
 
試してみました。
>数量:98.1
>係数:3.27
この実例だとうまくいきましたが、別の数字でうまくいかないのが出てきました。
勘違いかもしれませんので、もう少し検証してみます。

回答
投稿日時: 17/09/01 09:49:06
投稿者: sk

引用:
この実例だとうまくいきましたが、別の数字でうまくいかないのが出てきました。

前述の式では CCur 関数によって[数量]と[係数]の値を
それぞれ通貨型のデータに変換しているわけですが、
通貨型の有効桁数は整数部が 15 桁、小数部が 4 桁です。
 
したがって、例えば[数量]と[係数]のいずれかの値に
小数点第 5 位以下の端数を含まれる場合は、
通貨型への型変換を行なわれる際に
その端数が丸められることになるため、
正確な演算結果が返されない可能性が生じます。
 
引用:
数量:98.1
係数:3.27

引用:
「[数量]/[係数]」は「30」

(実際には極小の端数を含んでいるが)
画面上で視認出来る演算結果(=文字列)を
そのまま Int 関数や数値比較に適用したい場合は、
例えば以下のような式を設定してもよいでしょう。
 
------------------------------------------------------------------------
 
IIf(CDbl(CStr([数量]/[係数]))=Int(CDbl(CStr([数量]/[係数]))),"○","×")
 
------------------------------------------------------------------------
 
もしくは、[数量]と[係数]のデータ型を十進型にするとかでしょうか。

投稿日時: 17/09/12 11:47:02
投稿者: 滝沢

sk様
コメントありがとうございます。
 
色々実験で手間取りましたが、
CDbl(CStr(・・・
でうまく行ったようです。
ありがとうございます。