masat21です。
現在100000の値に対し、1000で割った値100.000の少数点以下の桁数を
1000で割る前にチェックする方法についてご存知の方がいましたら、
ご教示願います。
例を以下に示します。
(1) 100001を1000で割ったときの有効桁数が2の場合-> NG
(2) 100001を1000で割ったときの有効桁数が3の場合-> OK
初歩的な質問ですが、回答よろしくお願いします。
>100000の値に対し、1000で割った値100.000の少数点以下の桁数を
>1000で割る前にチェックする方法
有効桁数をチェックするという事でしょうか?
IEEE754 の場合
float 型なら、小数点以下 約 7 桁が有効桁数。
double 型なら、小数点以下 約 15 桁が有効桁数。
回答いただきありがとうございます。
上記の件は大変参考になりますが、
本題で言っている桁数チェックというのは、
VC++ .NETからSQL Serverへデータを書き込む場合の桁数、
つまり、DBにデータを書き込むときにおける桁数チェック
(上下限チェック)のことです。
以前の例で言うと次のようになります。(1000で割ったときの値)
(1) 100.001でDBの精度6でうち有効桁数2の場合 ->NG(オーバーフロー)
(2) 100.001でDBの精度6でうち有効桁数3の場合 ->OK
回答よろしくお願いします。
ある値を1000で割った答の小数点以下の桁数を知りたいということでしょうか。
であれば、割られる値をxとしたとき、
xを1000で割ったときの余りが0なら、小数点以下は0桁
そうでなく、100で割ったときの余りが0なら、小数点以下は1桁
そうでなく、10で割ったときの余りが0なら、小数点以下は2桁
そうでないときは、小数点以下は3桁
という判定が一案。
そもそもな逃がしたいのかはっきり判りませんけどなんとなく妄想。
正しい 100.10 とかに対して 100.09999 とか出てきて、拒絶されてあぢゃぱー
に一票。
そーいう要望に対して double を使っているのであれば設計ミス。
固定小数を使うべし。
回答いただきありがとうございます。
tetrapodさんのおっしゃっている内容が正しいです。
※tetrapodさん、妄想ではありませんよ!
初歩的な質問で恐縮ですが、固定小数の使い方についてご教示
いただけると幸いです。Cには固定小数型はなかった記憶があります。
簡単にいうと100001を1000で割る前に、DBの精度の桁数の上下限
チェックがしたいのです。
よろしくお願いします。
うーん iijima さんの案でいけてるはずなんですけど?
101000 を %1000=0 ... 小数点の下に0桁ある
100100 を %1000=100 %100=0 ... 小数点の下に1桁ある
100010 を %1000=10 %100=10 %10=0 ... 小数点の下に2桁ある
100001 を %1000=1 %100=1 %10=1 ... 小数点の下に3桁(以上)ある
# 最初に剰余0が出てくるところはどこ?だけで判定可能。
ってそういう話ぢゃない? これも立派な固定小数点演算だよ。
単に浮動小数点数での除算の前に整数剰余を求めておけばいい。
整数剰余で桁数判定を行った後に浮動小数点数で除算した結果が
100.099999 みたいになるのは別の話。
こっち (桁落ち/精度落ち) の回避の話ですか?
ちなみに「小数点」であって「少数点」ではないのでよろしく。
>簡単にいうと100001を1000で割る前に、DBの精度の桁数の上下限
チェックがしたいのです。
書いてあることがわからない。
10001や1000は固定と言うこと?
だとしたら、プログラム作る必要あるの。
固定でなかったらきちんと条件を明記すべし。
DB云々と書いてあるけど、どこにデータベースが出てきてるの?
データベースが絡むのだったらそれは何のDB?
早速会社に行って、実装と確認を行ったところ、
問題なく上下限のチェックができました。
回答いただきありがとうございました。
ツイート | ![]() |