
double型での計算を行うとよく誤差が出るのは知っているのですが
System.out.println(99.98+0.01);
といった簡単な計算ですら数値が狂うのは何故なのでしょうか?-サブ質問1
みなさんは厳密な計算が必要なときどのように処理を行っていますか?-サブ質問2
ちなみに私はできるだけdouble型は使わないことで回避しています。
処理したい有効桁数分10^n倍していってlong型で計算したのち元に戻したりと。
もっとスマートにdouble型だけで正確に計算して使っている方が
いらっしゃいましたらその技を伝授していただけませんか?-メイン質問
わかる範囲でいいのでお答えをお持ちの方がいらっしゃいましたらよろしくお願いします。
No.4ベストアンサー
- 回答日時:
こんにちは
>といった簡単な計算ですら数値が狂うのは何故なのでしょうか?-サブ質問1
2進数だと無限小数(循環小数)になるから、誤差が大きく出てしまうのですね。
>みなさんは厳密な計算が必要なときどのように処理を行っていますか?-サブ質問2
私は分数の概念を使って計算させています。
結局、我々が入力する数値は整数か有限小数ですよね。
それらの四則演算は有理数同士の四則演算なので、結果が整数、有限小数、循環小数のいずれかになります。
これらを正確に表そうとすると、分母と分子が整数の分数として扱うのが良いですね。
これを使うと、例えば
x=1÷3
というようにxに1÷3を入れると、xは0.33333・・・と循環小数になりますが、内部的には3分の1となっているので、
x=x×3
とやると、xは1になってくれます。
>もっとスマートにdouble型だけで正確に計算して使っている方が
>いらっしゃいましたらその技を伝授していただけませんか?-メイン質問
スマートには難しいですね。
分数での処理がスマートかと言われると難しいですね。
No.5
- 回答日時:
>ちなみに私はできるだけdouble型は使わないことで回避しています。
>処理したい有効桁数分10^n倍していってlong型で計算したのち元に戻したりと。
少しだけスマートでいうと、10^n倍したんなら整数になっているはずなのでそのままdoubleで計算しても(有効数値15桁を超えたり、整数で割り切れない割り算をしたりしない限り・・・整数計算なので当然)誤差は出ません。
数字文字列に変換するときは10^n倍したまま、いったん文字列に入れて、下からn桁目の左に小数点を割り込ませるように文字列処理すればいいと思います。
No.3
- 回答日時:
厳密というか、
そういう困ったチャンなことが起きる場合は
BigDecimal使ってこちら側の意図するどおりの桁扱いをするようにしています。
めんどくさいんですけどね。
No.2
- 回答日時:
doubleは8バイトの浮動小数点です。
http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text …
>もっとスマートにdouble型だけで正確に計算して使っている方が
>いらっしゃいましたらその技を伝授していただけませんか?-メイン質問
10進数に換算すると有効桁数は15桁です。
つまり16桁目以降で誤差がでる可能性があります。
double型ではそれ以上の精度の計算は「不可能」です。
計算で誤差をだしたくないなら
整数型で分母と分子を分け、
無理数や定数は別に計算するような
クラスを作ってはどうでしょうか?
>ちなみに私はできるだけdouble型は使わないことで回避しています。
>処理したい有効桁数分10^n倍していってlong型で計算したのち元に戻したりと。
あまり意味があるものではありません。
結局longも8バイトの整数型なのですから有効桁数に限界があります。
longの限界は9223372036854775807
1桁けずって18桁が有効桁数です。
計算速度を考えればdoubleでやったほうが圧倒的に速いですし、有効桁数が限られている以上、精度には限界があります。
No.1
- 回答日時:
> System.out.println(99.98+0.01);
> といった簡単な計算ですら数値が狂うのは何故なのでしょうか?-サブ質問1
2進数で計算しているからです。99.98、0.01 はいずれも2進数では無限小数になります。
それを有限なコンピュータで計算するのですから、小数点以下のどこかでぶったぎる
必要が生じます。そのための誤差です。
> みなさんは厳密な計算が必要なときどのように処理を行っていますか?-サブ質問2
何をもって厳密と考えるかにもよります。何かの測定値であれば、そもそも最初から
誤差を含んでいますから、10進数での表現と2進数の表現とでどちらが正しいとも
言えないと思います。99ドル98セントといった数値であれば、java.math.BigDecimal等を
使うかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 高校 有効数字計算 確定した値を含む 2 2023/01/18 06:03
- その他(ビジネス・キャリア) 今時の派遣社員って仕事が出来ないだけじゃなく計算も出来ないのか? 8 2022/07/22 20:53
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# c言語について 下記の計算結果を出力するコードを記述する問題で 0-4 3.14×2 5÷3 30÷ 5 2022/05/17 22:41
- 計算機科学 誤差についてです 誤差の逐次伝播の問題を出されたのですが、どのように解けば良いかわからず困っています 11 2023/04/22 15:47
- 物理学 誤差についてです 誤差の逐次伝播の問題を出されたのですが、どのように解けば良いかわからず困っています 2 2023/04/22 21:54
- 数学 時々、回答者の見識に疑念を抱いてしまうんです。私だって本当は皆様のことを疑いたくはありません。しかし 2 2022/11/27 12:23
- 化学 有効数字の取り扱いについて 高校化学では、測定値同士の計算結果の有効数字は、測定値に合わせるようにな 4 2022/06/30 14:07
- 高校 高校化学有効数字計算 4 2023/02/26 09:09
- 生物学 【生命科学】ヒトが1日に消費するATP量?(精度を変えて再計算) 3 2022/10/07 18:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0dの意味を教えてください
-
最大値と最小値の求め方
-
double型の足し算について
-
実数からの小数部の取得
-
C言語のポインターに関する警告
-
動的配列が存在(要素が有る)か...
-
System.err. printlnとSystem.o...
-
(漢和辞典)部首の配列法は?
-
javaの掲示板について
-
偶数ビットだけと奇数ビットだ...
-
オブジェクトの中のプロパティ...
-
1~100までの数字を表示したい
-
int型で表示したいのですが・・・
-
所持金の計算式とその表示の仕方
-
ORA-01858: 数値を指定する箇所...
-
PrintWriterクラスのバッファ機...
-
配列
-
多次元配列は配列の配列である
-
1~100までの数字を表示し、か...
-
system.out.printが出力されない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0dの意味を教えてください
-
実数からの小数部の取得
-
べき乗
-
double型変数値の整数部分のみ...
-
Javaで何パーセント%かを表示...
-
Java math.powメソッド
-
javaで1.8x10の308乗÷...
-
掛け算演算を使わない掛け算
-
Java 7日後までの天気を予測する
-
小数点以下の切捨てにつきまして
-
浮動小数点とセットで使用され...
-
Java 出力 桁数調整
-
自然対数の底Eを含むStringの数...
-
乱数のdouble型について
-
最大値をもとめる
-
Javaによる利率計算の実装方法
-
最大値と最小値の求め方
-
数値からバイト配列への変換に...
-
モンテカルロ法を用いた球の体...
-
java のfor文について質問です。
おすすめ情報