keisuke-matsuda / pg_ex21

0 stars 0 forks source link

もう1つ質問です。 #5

Open keisuke-matsuda opened 7 years ago

keisuke-matsuda commented 7 years ago

ご指摘ありがとうございます。 参考にさせていただきます。

もう1つ質問なのです。 今回通話料金を計算するにあたって、計算から得られた料金が整数ではない場合に切り捨てる仕様でした。私はキャストを利用して、切り捨てを実現したのですが、これは一般的な考え方なのでしょうか? floatやdouble等を利用したほうが良いのでしょうか?(float,doubleの方が繰り上がり、切り捨てなど柔軟にできそうですが。。。。)

amapyon commented 7 years ago

@keisuke-matsuda 整数型を使うか、浮動小数点型を使うかどうかは、仕様に合わせて選択します。 料金計算するをする場合は、BigDecimal型を使うこともあります。

今回の仕様は、int型での計算が最適になるようにしています。 int型の変数同士の計算では、小数は切り捨てられますので、キャストは不要です。

ちなみに、以下の計算結果はどうなると思いますか? System.out.println(0.1 + 0.2);

keisuke-matsuda commented 7 years ago

なるほど。 ありがとうございます。

System.out.println(0.1 + 0.2); だけ見ると、自動的にdouble型に変換されて0.3として出力されたりすると思いました。 実際やってみると"0.30000000000000004"となるのですね。

keisuke-matsuda commented 7 years ago

調べてみたらfloat/double型を持いた計算で社、上のように意図しない少数の丸め方をされてしまうのですね。

今後、少数の計算を使用するケースではBicDecimalケースを利用することを心がけます。

amapyon commented 7 years ago

科学計算などでは、float,doubleのような、浮動小数点型を用いることが多いです。

BigDecimalは、それなりに計算に時間がかかるというデメリットがあります。