いいね!数

1

閲覧数
599
初めまして。

さっそくですが、質問です。

2014年4月からの消費税8%問題に伴い、これまで問題なかったプログラムで問題がでてきました。

【現象】

 税込金額から税抜額を計算するときに、単純に書くと下記のような計算式を使ってます。

ZeiNukiGaku = int (270000 / 1.08 )

 int関数は、小数点を切り捨てするために使ってます。

上記は、1.08できれいに割り切れるはずなのですが、このint関数を 噛ますと、

250001」と返ってきちゃいます。

ここらに、×(-)とか、 +0.5とかするとなんかうまくいっているようです。

前から、ここらの関数はシフト演算がどうたらこうたら、2進数だからどうたらこうたらみたいので

微妙感じな情報はありましたが、これは、不具合?仕様?どちらなのでしょうか?

1からずっとループさせて計算させてみたことろ、5%のときは、発生せずに、6%から徐々に

対象が増えてきて、10%では、結構な値がヒットしてきました。

いまいち、どういうルールでおかしくなるのか、わかりませんでした。

下記にも似たようなのはあるので、使っている方が間違いなのですが、消費税8%切り替えで古いDBは問題が出てきそうです。。。

http://domino.webserve.ne.jp/webserve/notesqa.nsf/All/FEC05B8C76C158E049256F5B0032603A?OpenDocument

サーバー情報: | クライアント情報: | 
カテゴリ:アプリ開発 - Notes アプリ | タグ:
  | 質問日時:2014/03/16 2:01:43

回答・コメント

いいね!数

1

int関数の戻り値の説明は

Int 関数の戻り値のデータ型は、numExpr のデータ型によって決まります。

となっているので、int関数の仕様ではないでしょうか(割り算なので自動でdouble型に変更されてる気がします)。

 

ですので、この場合は、Currencyデータ型を使い、計算式も

ZeiNukiGaku = CCur( 270000 / 1.08 )

としてみると良いと思います(きちんと検証したわけではありませんので悪しからず・・・)。

 

一応、ヘルプにあるCurrencyデータ型の説明によると、

通貨の値の表現に適すように、小数点以下 4 桁の 8 バイト整数が入った変数を指定します。

となっています。

 

でも、全部のDBでint関数をccur関数に変えるのは酷ですよね・・・

回答日時:2014/03/16 22:14:02

いいね!数

2

LotusScript に限った話ではなく、VB でも同様の議論が多く交わされているようですね。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=44107&forum=36

 

結論として、Int() の仕様上の振る舞いでは無いかと個人的には考えています。

回避策ですが、guylocke さんの書かれているような方法もあると思いますし

計算結果を int() に渡してあげると期待通りの値が返ってくるような気がします。

 

ZeiNukiGaku = 270000 / 1.08

ZeiNukiGaku = int (ZeiNukiGaku)

 

のような感じで。。

回答日時:2014/03/17 1:48:45

いいね!数

0

>ZeiNukiGaku = 270000 / 1.08

>ZeiNukiGaku = int (ZeiNukiGaku)

 

正確なロジックでは下記のような感じで、一旦変数に入れていますが、NGでした。

ZeiNukiGakuは、「Double」型なので、そこも起因しているかもですが。

 

回答日時:2014/04/15 21:13:46

いいね!数

0

long 型を利用するとかは?

回答日時:2014/03/17 19:28:33

いいね!数

2

最終的には、下記サイトで見つけた  int (Cdlb (Cstr(消費税)))で、対応しました。

 

http://domino.webserve.ne.jp/webserve/notesqa.nsf/All/FEC05B8C76C158E049256F5B0032603A?OpenDocument

 

今のロジックに一番影響を与えなそうだったのと、1~100万までの値をExcelで比較すると問題なさそうだったので。

回答ありがとうございました。

回答日時:2014/03/19 9:29:37