C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: 消費税はint型?


(過去ログ 118 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■69103 / inTopicNo.1)  消費税はint型?
  
□投稿者/ のぶ (43回)-(2013/12/04(Wed) 16:59:39)

分類:[雑談] 

2013/12/04(Wed) 17:02:06 編集(投稿者)
2013/12/04(Wed) 17:01:58 編集(投稿者)

いつもお世話になっています。

とあるシステムを改修していて、ふと消費税がint型である事に気づきました。
そこで各国の消費税を調べてみると5.5%というような小数点以下まである国もありました。

現在のシステムではこのような5.5%等の値には対応できないため、修正すべきか悩んでいます。
悩んでいるいる理由は、現在修正している箇所と全く別箇所の修正なので、今はやるべきじゃないだろうなぁ・・・と思っているためです。

質問ですが、皆様は消費税を扱う変数は整数型を使用していますか?それとも浮動小数点数型を使用していますか?

== 追記 ==
読み返して、言葉足らずに感じたので追記します。
> ふと消費税がint型である事に
これは税率を保存する変数です。

例えるなら、
int tax = 5;
のような感じです
引用返信 編集キー/
■69104 / inTopicNo.2)  Re[1]: 消費税はint型?
□投稿者/ kaina (3回)-(2013/12/04(Wed) 17:20:18)
タイムリーな話題なのでかきこ。

私も今はいない人が作成したシステムについて
来年4月の5%から8%への変更における
影響調査をやったところでした。

そのシステムではDB内の消費税マスタで管理しており、
desimal(4,2)で消費税を持ってますね。
FROM-TOで有効期限も保持していた為、
非常にメンテナンスが楽な作りになっていてよかったです。

引用返信 編集キー/
■69106 / inTopicNo.3)  Re[2]: 消費税はint型?
□投稿者/ のぶ (44回)-(2013/12/04(Wed) 18:07:26)
No69104 (kaina さん) に返信
ご返信ありがとうございます。
decimal型ですか・・(うらやましい・・・おっと本音がw)

日本では3% 5% 8% 10%とたどるのでintでも数年は大丈夫だろうとは思っていますが、
最低でもdoubleとかにはしたいですよね。。。
引用返信 編集キー/
■69107 / inTopicNo.4)  Re[3]: 消費税はint型?
□投稿者/ とっちゃん (181回)-(2013/12/04(Wed) 18:53:29)
とっちゃん さんの Web サイト
No69106 (のぶ さん) に返信

> 最低でもdoubleとかにはしたいですよね。。。
ここの掲示板でも時々話題に上がりますが、double や float はそのデータ構造の制約により、意図した値とは異なる状態になることがあります。

ユーザーは5.5% と入れたつもりなのに、実際には、5.49999999% みたいな状態になってしまうということです(ちなみに数値はでっち上げでこうなっているかどうかはわかりません)。

誤差の影響が出ない場合もありますが、金融計算での誤差は最初に指摘される問題なので、誤差が出る可能性のある数値型の利用は避けたほうがいいと思います。

引用返信 編集キー/
■69108 / inTopicNo.5)  Re[3]: 消費税はint型?
□投稿者/ 774RR (126回)-(2013/12/04(Wed) 18:53:48)
俺は幸いにして金融系の仕事とは縁がないわけだが、浮動小数点数で金の計算はしたくないなぁ。

税率を保持する変数の型と
その値を使って演算する箇所の型とは
違っていいわけで・・・

少なくとも日本では法律を作る側が既存のシステムを無視できないだろう・・・
(整数型で税率を保持しているプログラムを修正させると社会的混乱を招く)
って俺は思ってる。だから税率を保持する型は int でもいいんぢゃないかな。
次の元号(年号)もローマ字表記の頭文字が BGKMTSH にかぶらないように制定してくれると信じてる。

decimal 使えるならそっちのほうが絶対に良い、のは間違いない。
引用返信 編集キー/
■69109 / inTopicNo.6)  Re[4]: 消費税はint型?
□投稿者/ のぶ (45回)-(2013/12/04(Wed) 20:18:00)
No69107 (とっちゃん さん) に返信
いつもご返信ありがとうございます。

誤差の事は書いている時は忘却の彼方でしたw
単純に数字を保持する変数はどうするかなぁ?といった脳の回転をしてました。

金額が絡んでいるのでdecimal(今のシステムはMFCなのでCCurrency(でしたっけ?))を使うのは当然ですね。


引用返信 編集キー/
■69110 / inTopicNo.7)  Re[4]: 消費税はint型?
□投稿者/ のぶ (46回)-(2013/12/04(Wed) 20:22:32)
No69108 (774RR さん) に返信
ご返信ありがとうございます。

> 少なくとも日本では法律を作る側が既存のシステムを無視できないだろう・・・
> (整数型で税率を保持しているプログラムを修正させると社会的混乱を招く)
> って俺は思ってる。だから税率を保持する型は int でもいいんぢゃないかな。
これは今の自分の気持ちと一緒です。
というか、そうなってほしいという願望の方が強いんですけどね。
引用返信 編集キー/
■69111 / inTopicNo.8)  Re[5]: 消費税はint型?
□投稿者/ 魔界の仮面弁士 (447回)-(2013/12/04(Wed) 20:59:22)
No69109 (のぶ さん) に返信
> 金額が絡んでいるのでdecimal(今のシステムはMFCなのでCCurrency(でしたっけ?))を使うのは当然ですね。

MFC は全く分からないので、とりあえず CCurrency という名前で google って見ましたが、
それらしい情報を見つけられませんでした。CY とか COleCurrency と言った名は出てきましたが。


COM の世界だと、10進数の小数を扱う場合は CURRENCY か DECIMAL でしょうね。
OLE API の変換関数だと、VarCyFrom何某() とか VarDecFrom何某() とか。

VARIANT の CURRENCY 構造体は、小数点以下の精度が 4 桁固定なので、
途中の演算内容によっては、精度が不足する可能性もありますね。
(あらかじめ 一万倍してから演算するという対処法もありますが…)


> 単純に数字を保持する変数はどうするかなぁ?といった脳の回転をしてました。

変数だけの問題では無いですね。元データの型もそうですし、演算途中の型も重要です。
たとえば、元データが浮動小数点だと、元データが誤差を含んでいる可能性があるので
その後で VarCyFromR4 とかしても手遅れだったりします。

ということで、少なくともデータベース側が浮動小数点な値というのは全力で却下。(^^;
引用返信 編集キー/
■69115 / inTopicNo.9)  Re[6]: 消費税はint型?
□投稿者/ のぶ (47回)-(2013/12/05(Thu) 09:31:44)
No69111 (魔界の仮面弁士 さん) に返信
ご返信ありがとうございます。

> MFC は全く分からないので、とりあえず CCurrency という名前で google って見ましたが、
> それらしい情報を見つけられませんでした。CY とか COleCurrency と言った名は出てきましたが。
COleCurrencyでした。。それを継承したCHogeCurrencyを普段は扱ってたので基底クラスの名前が出てきませんでした。


> 変数だけの問題では無いですね。元データの型もそうですし、演算途中の型も重要です。
> たとえば、元データが浮動小数点だと、元データが誤差を含んでいる可能性があるので
> その後で VarCyFromR4 とかしても手遅れだったりします。
>
> ということで、少なくともデータベース側が浮動小数点な値というのは全力で却下。(^^;

金額を扱う(or 精度が要求される)際は、decimalなり、COleCurrencyなりで扱うべきという事ですね。
#つまり、現システムはそのうちint -> COleCurrencyへの変更が発生した方が安心か・・・
#でもその前にMBCSだからそれをなんとかしないと・・・

お答え頂いた皆様ありがとうございました!参考になりました!
解決済み
引用返信 編集キー/
■69116 / inTopicNo.10)  Re[7]: 消費税はint型?
□投稿者/ のぶ (48回)-(2013/12/05(Thu) 09:37:55)
ありがとうございました!とか言っておきながら聞き忘れた事がありました(^_^;)

C#での話になりますが、decimalってfloat,doubleに比べ処理速度が遅いとよく言われていると思いますが、
これはそんなに顕著なものなのでしょうか?

金額計算が主なソフト(例えば見積作成ソフトとか)ですと、decimalまみれになりそうな感じですが、
激遅になるのでしょうか?それとも比べれば遅いけど、特に気にならない程度のものなのでしょうか?
引用返信 編集キー/
■69129 / inTopicNo.11)  Re[8]: 消費税はint型?
□投稿者/ shu (444回)-(2013/12/05(Thu) 15:19:02)
No69116 (のぶ さん) に返信
> ありがとうございました!とか言っておきながら聞き忘れた事がありました(^_^;)
>
> C#での話になりますが、decimalってfloat,doubleに比べ処理速度が遅いとよく言われていると思いますが、
> これはそんなに顕著なものなのでしょうか?
>
今どきのPCでは気にならないかと思います。遅いとしても処理速度が遅いからと言って浮動小数点計算による
誤差に悩まされたりintに直してから計算するのも間違いのもとなのでそんなことはしない方がよいと思います。

引用返信 編集キー/
■69132 / inTopicNo.12)  Re[9]: 消費税はint型?
□投稿者/ 774RR (128回)-(2013/12/05(Thu) 17:39:52)
double の加減乗除演算は Native 命令で1命令になったりするのに対して
decimal の加減乗除は終局的にはライブラリ関数が行うので遅いっすよ。
演算1個は単純に考えて10000倍くらい遅いんでないかな。

ただ double で単純演算したのでは金銭計算という用件に合致しないことがほとんどで、
1個演算するたびに丸めたり補正したりする必要が生じる、のは明らか。

同じ結果を得るための演算量は変わらないんで結局同じ速度になるんぢゃないかな。
ならば「自分で作らないで済む」(出来合いのものがそのまま使える)という点で
Decimal 使ってしまうほうが簡単(バグを生まない)だと思う。
引用返信 編集キー/
■69134 / inTopicNo.13)  Re[10]: 消費税はint型?
□投稿者/ のぶ (49回)-(2013/12/05(Thu) 18:27:09)
shuさん、774RRさん、度々ありがとうございます。

出来合いのもので、簡単にできるのにそれを使わない手はないですもんね。
それのトレードオフで時間が掛かったとしても体感できるレベルではないでしょうし。


沢山回答頂きありがとうございました。
結論として、金額絡むものはdecimalなり、COleCurrencyなりを使う!
decimal遅い?正確なんだからいいじゃない!
としたいと思います。
解決済み
引用返信 編集キー/
■69135 / inTopicNo.14)  Re[11]: 消費税はint型?
□投稿者/ とっちゃん (182回)-(2013/12/05(Thu) 19:38:37)
とっちゃん さんの Web サイト
No69134 (のぶ さん) に返信
> decimal遅い?正確なんだからいいじゃない!
> としたいと思います。

今時ねただし、雑談なので、遅いところは並列にしましょう!

これから作るUIのあるプログラムの動作環境は例外なくといっていいくらい、複数のコアがある状況で動作します。
進化の恩恵を受けるためには、あるものをすべて使う貪欲な仕組みが必要です。

ということで、遅いところは全部並列処理!
一度に一杯やれば、時間短縮できます。

キーワードは。。。Task<T>でいいのかな?
C++ なら、concurrency 名前空間。
#本題から外れるので、一応解決済みのまま
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -