0

私は現在Javaで電卓プログラムを書いています。これは私の最初の Java プログラムで、C++ には慣れています。

Java の double は、c++ の double とはまったく異なることに気付きました。Java および C++
4.1*3
that/.1でこれを試してください


12.3 の次に 123である必要があり、c++ ではこの結果が得られますが、Java
では 12.299999999999999 および 122.99999999999999が得られます。

C++ のように double を使用して数学を行うにはどうすればよいでしょうか。プログラムで 12.299999999999999 を使用しても、12.3 と比べてまったく違いがないことは理解していますが、ユーザーが数字を読んでいるとき、これは非常に見苦しいものです。BigDecimal クラスを調べましたが、そのクラスでは三角関数や対数などを実行できません

4

6 に答える 6

8

数学は同じです。ほとんどのC/C ++ディスプレイは、最下位ビットの不正確さを回避するために数値を丸めるため、ディスプレイは異なります。

于 2011-03-21T22:43:21.720 に答える
7

では、なぜこれが不正確なのでしょうか。:4.1は (固定小数点か浮動小数点かに関係なく) 2 進数として正確に表現できないため、次のdouble値に丸められます。これに 3 を掛けても、表現できないという事実は変わりませんが、エラーが増幅されるため、10 進数からの変換とは異なる 2 進数値12.3になります。したがって、再度 10 進数に変換すると、9 がたくさんある数になります。

それに 10 を掛けると、単純に誤差を 10 倍に増幅します (0.1正確に表現できないため、0.1 で割ると誤差が増えます)。

あなたの C++ プログラムは、おそらくまったく同じ操作を使用していました。Java での表示が異なる理由は、文字列から数値を再現するために必要なすべての数字が表示されるのに対して、C++ 出力関数が何らかの方法でそれを丸めているためです。(出力コードが表示されないため、そこで何をしたかはわかりません。)

人間のユーザーがダイジェストする数値を出力する場合は、NumberFormat(java.text 内の) またはFormatter(java.util 内の) a を使用します。

于 2011-03-21T23:09:42.313 に答える
4

Java の double は、c++ の double とはまったく異なることに気付きました。

実際、Java は C++ とまったく同じ double の表現を使用し、演算は (ほとんどの場合) 内部でまったく同じ値を生成します。

ここでの根本的な問題は、2 進浮動小数点数表現と 10 進表現の間に正確な 1 対 1 のマッピングがないことです。のような数値12.3は、2 進浮動小数点数として正確に表すことはできません。それは数学的に不可能です。

これを理解するには (そしてあなたがすべきです)、「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」を読んでください。

観察している違いは、出力用に double 値を数字に変換する書式設定コードの違いによるものです。Java の場合、コードは実際の double の最も正確な 10 進数表現を提供しています。C++ の場合、最下位桁を四捨五入しています ... これにより期待する数値が得られますが、最も正確な 10 進表現ではありません。

どちらのアプローチも間違っていません。彼らはただ違うだけです。Java で数値を特定の桁数に丸めて表示する場合は、Java フォーマッタ クラスの 1 つを使用してこれを行うことができます。

もう 1 つの方法は、BigDecimalクラスを使用して Java ですべての電卓演算を行うことです。これにより、高校で学んだ小数算術の制限を法として、正確な数値が得られます。たとえば、1/3 のような分数を 10 進数で正確に表すことはできません。欠点は、BigDecimal算術演算が浮動小数点数より桁違いに遅く、API の使用が面倒なことです。

于 2011-03-22T00:05:19.660 に答える
1

おい、 Java Doublesは数学が得意ではありません。遅いですが、Javaのdouble(小さいもの)(または他の64ビットIEEE 754)とまったく同じくらい正確です。BigDecimalはさらに遅くなります。

(男が従うかどうかわからない)

于 2011-03-21T22:43:35.967 に答える
1

すべての算術モデルは、精度、スペース、速度の間のトレードオフを表しています。

浮動小数点は、言語に関係なく、スペースを節約して速度を上げるために精度の一部を犠牲にします。

固定小数点は別のトレードオフであり、任意精度の演算はさらに別のトレードオフです。

任意精度の複雑な計算が必要な場合は、Apache commons-mathapfloatなどの専用の数学ライブラリが必要になります。

于 2011-03-21T22:52:48.450 に答える
0

ご覧になりましたjava.lang.StrictMathか?javadocs からは、C に近いかもしれないという印象を受けますが、私はあまり計算をしないので、確かなことはわかりません。

それ以外の場合は、geekosaur に同意します。出力が唯一の問題であるjava.text.NumberFormat可能性があり、ここで役立つ場合があります。

于 2011-03-21T22:50:21.467 に答える