Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

桁数オーバーの計算

99999999と99999999.9999を掛け算した値をデータベースに登録したいのですが、”指定した精度を超えた値が列に指定されています”というエラーで登録できません。

データベース oracle9

int   AAA = 99999999;
float BBB = 99999999.9999;
float CCC = 0;

CCC = AAA*BBB;

CCCを格納するデータベースの項目の型はNUMBER(20,4)です。

また、データベースに登録する前にログでCCCの値を出力してみた際、1.0000000272564224E16と表示されました。
実際省略せずに計算値を表示した場合、9999999899990000という値になるので、データベースの桁数はオーバーしていないと思うのでが…。

よろしくお願いします。

7

回答

5700

閲覧

7件の回答

評価

0

Oracleなんて触ったこともないが。

>1.0000000272564224E16

AAA*BBBの結果としてなら、これはおかしい。
もしかしたら、おかしいのはここだけじゃないかもしれない。
まずはそれを始末してからじゃないか。

>省略せずに計算値を表示した場合、9999999899990000という値になる

「演算結果をint型に変換して表示させたら」という条件を、ちゃんと明記しましょう。

>思うのでが…。

脳内コードなんて、誰でも完璧。
実際はやってることが違うなんて、多々あるからね。

評価

0

すみません。
CCCをdouble型にしたら登録できるようになりました。
小数部分の桁数がfloat型をオーバーしていただけのようです。

もう一つ質問なんですが、9999999899990000をdoubleで表現すると、なぜ1.0000000272564224E16という表現になるのでしょうか?どぉいった意味ですか?
floatとdoubleをどのように使い分けていいかわかりません。計算結果を見れば判断できますが、定義時にはどういった場合にdoubleを使うべきですか?

よろしくお願いします。

評価

0

http://www.javaroad.jp/java_variable.htm

評価

0

>もう一つ質問なんですが、9999999899990000をdoubleで表現すると、なぜ1.0000000272564224E16という表現になるのでしょうか?

9.99999989999E16じゃないの?

評価

0

9.99999989999E15でしたね!
失礼しました。

常に、計算結果を表示する変数はdoubleにしておけば間違いないのでしょうかね?

評価

0

16じゃなくて、15だったか。

1.0000000272564224E16ってのは、どこから出てきたんだか。

評価

0

1番初めの計算で、BBB、CCCをfloat型で計算した場合に、CCCの結果が1.0000000272564224E16になったんですよ…。なので、floatの表現方法がいまいちわからないなぁと。

詳しく書くと、本当は99999999.9999は画面上で入力された値を受け取ってBBBに代入していたんですよ。ですが、今回改めて些細なミスはないかと、直接BBBに99999999.9999をセットしてテストしてみたんです。そしたら、float型に99999999.9999は入力できないとエラーがでたので、もしや桁がたりていないのでは…と気づきdouble型にしたのです。

ただ、疑問なのは、なぜ画面からの値をセットしている場合99999999.9999はfloat型のBBBに代入してエラーにならなかったのか?という事と、CCCの結果をだす直前でBBBをログにだしてみたところ、ちゃんと99999999.9999と表示されていたのが納得いかないところです。

でも、今回の事で浮動小数点について勉強になったので良かったかなぁと!

色々ありがとうございました。



質問から6ヶ月以上経過しているので、回答を書き込むことはできません。