[解決済み] Javaでdoubleを使用して精度を保持する
質問
public class doublePrecision {
public static void main(String[] args) {
double total = 0;
total += 5.6;
total += 5.8;
System.out.println(total);
}
}
上記のコードは印刷されます。
11.399999999999
これを11.4と印字するだけ(として使えるようにする)にはどうしたらいいのでしょうか?
どのように解決するのですか?
他の方もおっしゃっているように、おそらくは
BigDecimal
クラスは、11.4 を正確に表現したい場合に使用します。
さて、なぜこのようなことが起こるのか、少し説明します。
その
float
と
double
Java のプリミティブ型は
浮動小数点
ここで、数値は分数と指数の2進表現として格納されます。
具体的には、倍精度の浮動小数点値である、例えば
double
型は64ビットの値であり、ここで
- 1ビットは符号(正または負)を表す。
- 11ビットで指数を表す。
- 有効数字(2進数としての分数部)用52ビット。
これらのパーツを組み合わせることで
double
を表現する。
(出典 ウィキペディア 倍精度 )
Javaでの浮動小数点値の扱い方の詳細については セクション 4.2.3: 浮動小数点型、フォーマット、および値 の「Java言語仕様」を参照してください。
は
byte
,
char
,
int
,
long
タイプは
固定小数点
は、数を正確に表現したものです。固定小数点数とは異なり、浮動小数点数は正確な数値表現を返せないことがあります(ほとんどの場合、quot;と考えてよいでしょう)。このため
11.399999999999
の結果として
5.6 + 5.8
.
1.5や150.1005のように正確な値が必要な場合は、その数を正確に表現できる固定小数点型のいずれかを使用することになります。
すでに何度か触れているように、Javaには
BigDecimal
クラスは、非常に大きな数と非常に小さな数を処理することができます。
のJava APIリファレンスより。
BigDecimal
クラスがあります。
イミュータブルです。 任意精度の符号付き10進数 の数値です。BigDecimalは、以下の要素から構成されます。 任意精度の整数(未スケール と32ビット整数の目盛りがあります。もし ゼロまたは正の場合、スケールは の右側の桁数。 小数点以下が表示されます。負の場合は スケールされていない数値は の10乗を乗じたものです。 の否定を行う。の値は で表される数値は したがって、BigDecimal は (unscaledValue) となります。 × 10^-スケール)。
Stack Overflowには、浮動小数点数とその精度に関する質問が多数寄せられています。ここでは、関連する質問のうち、参考になりそうなものをリストアップしています。
- 21.4 のような値に初期化された double 変数が 21.3999618530273 と表示されるのはなぜですか?
- C++で本当に大きな数字を表示する方法
- 浮動小数点はどのように格納されるのですか?それはいつ問題になるのですか?
- 会計アプリケーションの金額には、フロートとデシマルのどちらを使用しますか?
浮動小数点数について本当に詳しく知りたい方は、以下をご覧ください。 浮動小数点演算についてコンピュータ科学者が知っておくべきこと .
関連
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] なぜゲッターとセッター/アクセッサーを使うのですか?
-
[解決済み] JavaScriptで浮動小数点数の精度を扱うには?
-
[解決済み】Javaの「ダブルブレース初期化」の効率化?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
this()の呼び出しはコンストラクタ本体の最初の文でなければならない 例外解決と原因分析
-
java Mail send email smtp is not authenticated by TLS encryption solution.
-
JDKの設定時にjava.dllが見つからない、java SE Runtime Environmentが見つからない問題が発生しました。
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。
-
HttpClientがGZIP形式でない場合の対処法
-
IDEA パッケージステートメントの欠落
-
ローカルリソースのロードが許可されていない場合の解決策