特定の小数に切り捨てられた2つのdouble変数を比較するときに精度の問題はありますか?

Edmund Chee:

BigDecimalsとRoundingModeを使用して、特定の小数点以下に切り捨てられた2つのdouble型変数を比較しようとしています。

たとえば、3.1456と3.145を比較する場合、ifステートメントで小数点以下3桁に切り捨てられますが、両方の値が互いに等しい場合にのみ、私のifステートメントはtrueを返します。

しかし、それは私のコードでは機能しませんでした

BigDecimal one = new BigDecimal(3.1456).setScale(3, RoundingMode.DOWN);
BigDecimal two = new BigDecimal(3.145).setScale(3, RoundingMode.DOWN);

if (one.equals(two)) {
    System.out.println("Both variables are equal");
} else {
    System.out.println("Both variables are not equal");
}

出力ロジックは偽でした。そこで、変数が切り捨てられる値を確認するためにいくつかのチェックを行いました。それはそれぞれ3.145と3.144で、予想外のものでした。3.144である理由がわかりません...

次に、DecimalFormatとRoundingModeを使用して、別の方法で上記を実行しました。それはかなりうまくいきました。

DecimalFormat df0 = new DecimalFormat("#.###");
DecimalFormat df1 = new DecimalFormat("#.###");
df0.setRoundingMode(RoundingMode.DOWN);
df1.setRoundingMode(RoundingMode.DOWN);

if (df0.format(num0).equals(df1.format(num1))) {
    System.out.println("Both variables are equal")
} else {
    System.out.println("Both variables are not equal")
}

上記の方法は非常にうまく機能します!BigDecimalは両方の値を3.145に評価します。

DecimalFormatを使用する場合と比較して、BigDecimalを使用してタスクを実行すると機能しない理由を理解できません。double型の変数がどのように機能するかと関係がありますか?(double)(0.2-0.1)のようなもので、0.1ではなく0.09999999 ...の結果が得られますか?

より良い解決策と理解で私を啓発してください!どうもありがとうございます!

ダイオキシン:

文書化されているように、これBigDecimal(double)は予測不可能です。

このコンストラクターの結果は、いくらか予測できない場合があります。Javaで新しいBigDecimal(0.1)を書き込むと、正確に0.1(スケールが1のスケールなしの値1)に等しいBigDecimalが作成されるが、実際には0.1000000000000000055511151231257827021181583404541015625に等しいと想定する人もいるかもしれません。これは、0.1をdoubleとして正確に表すことができないためです(つまり、有限の長さの2進数の小数として)。したがって、外観にかかわらず、コンストラクターに渡される値は正確に0.1ではありません。


彼らはBigDecimal(String)代替として使用することを提案しています

一方、文字列コンストラクターは完全に予測可能です。新しいBigDecimal( "0.1")を書き込むと、予想どおり、0.1完全に等しいBigDecimalが作成されます。したがって、これよりもStringコンストラクターを使用することをお勧めします。

のドキュメントからBigDecimal(String)

BigDecimal(double)コンストラクターの予測不能性の影響を受けないため、これは一般に、floatまたはdoubleをBigDecimalに変換するための推奨される方法です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

MySQLには、100MBなどの特定の値に達したときにテーブルを切り捨てる関数がありますか?

分類Dev

Erlangの変数に格納されているときに浮動小数点値が切り捨てられるのはなぜですか?

分類Dev

float64の数値を特定の精度に切り捨てるにはどうすればよいですか?

分類Dev

変換のために数値が切り捨てられているかどうかを確認する方法はありますか?

分類Dev

Javaでdoubleを切り捨てるための関数はありますか?

分類Dev

数値を乗算するときに列のデータが切り捨てられました

分類Dev

精度と順序を維持しながら、すべてのdoubleを一意のuint64_tに変換できる関数はありますか?(なぜ見つからないのですか?)

分類Dev

float64型を特定の精度に切り捨てるにはどうすればよいですか?

分類Dev

16進数からLPCVOIDに変換すると、アドレスの半分が切り捨てられます

分類Dev

Djangoセッションで保存された数値は、アイテムの小計を計算するときに自動的に切り捨てられます

分類Dev

列の問題のために切り捨てられたデータを解決する方法

分類Dev

Node.jsを使用して64ビットのfloatを32ビットの切り捨てられたfloatに適切に切り捨てて元に戻す(精度を落とす)にはどうすればよいですか?

分類Dev

SQLサーバー、SQLサーバーでキャストと浮動小数点を使用しているときに切り捨てられるデータdecimal(38,35)の1つの列があります

分類Dev

HALF_UPがときどき倍精度で切り捨てられるのはなぜですか?

分類Dev

Javaの:特定の属性に基づいて、2つの与えられたリストから、すべてではありません・イン・交差要素を含むリストを作成するための適切な方法はありますか?

分類Dev

ApacheDateUtilsはWEEKのために切り捨てられます

分類Dev

ApacheDateUtilsはWEEKのために切り捨てられます

分類Dev

jqは空白の後にENV変数を切り捨てます

分類Dev

BigDecimalから余分な小数をどのように切り捨てますか

分類Dev

要素の幅を8で割り切れる数に切り捨てることは可能ですか?

分類Dev

(変数によって)2つのロックされたスレッドが、それらの変数の1つを切り替えて、別のスレッドにアクセスしようとするとどうなりますか?

分類Dev

フロートを特定の精度に切り捨てる方法は?

分類Dev

doubleの値をintで割った値を切り捨てるにはどうすればよいですか?

分類Dev

DoubleからNSNumberに変換し、Swiftで小数点以下6桁までの精度を維持する方法はありますか?

分類Dev

動的に割り当てられた配列の最初の2つの数値を出力するのに問題があり、他の数値は正常に機能します

分類Dev

2つの一時変数がありますが、PHPでそれらを比較するにはどうすればよいですか?

分類Dev

C2つの文字列を比較するとメモリ割り当ての問題になります

分類Dev

オーディオを png から stdout に変換するときの ffmpeg の問題ですが、ファイルには問題ありません

分類Dev

Javaでdoubleを小数点以下2桁に切り捨てるにはどうすればよいですか?

Related 関連記事

  1. 1

    MySQLには、100MBなどの特定の値に達したときにテーブルを切り捨てる関数がありますか?

  2. 2

    Erlangの変数に格納されているときに浮動小数点値が切り捨てられるのはなぜですか?

  3. 3

    float64の数値を特定の精度に切り捨てるにはどうすればよいですか?

  4. 4

    変換のために数値が切り捨てられているかどうかを確認する方法はありますか?

  5. 5

    Javaでdoubleを切り捨てるための関数はありますか?

  6. 6

    数値を乗算するときに列のデータが切り捨てられました

  7. 7

    精度と順序を維持しながら、すべてのdoubleを一意のuint64_tに変換できる関数はありますか?(なぜ見つからないのですか?)

  8. 8

    float64型を特定の精度に切り捨てるにはどうすればよいですか?

  9. 9

    16進数からLPCVOIDに変換すると、アドレスの半分が切り捨てられます

  10. 10

    Djangoセッションで保存された数値は、アイテムの小計を計算するときに自動的に切り捨てられます

  11. 11

    列の問題のために切り捨てられたデータを解決する方法

  12. 12

    Node.jsを使用して64ビットのfloatを32ビットの切り捨てられたfloatに適切に切り捨てて元に戻す(精度を落とす)にはどうすればよいですか?

  13. 13

    SQLサーバー、SQLサーバーでキャストと浮動小数点を使用しているときに切り捨てられるデータdecimal(38,35)の1つの列があります

  14. 14

    HALF_UPがときどき倍精度で切り捨てられるのはなぜですか?

  15. 15

    Javaの:特定の属性に基づいて、2つの与えられたリストから、すべてではありません・イン・交差要素を含むリストを作成するための適切な方法はありますか?

  16. 16

    ApacheDateUtilsはWEEKのために切り捨てられます

  17. 17

    ApacheDateUtilsはWEEKのために切り捨てられます

  18. 18

    jqは空白の後にENV変数を切り捨てます

  19. 19

    BigDecimalから余分な小数をどのように切り捨てますか

  20. 20

    要素の幅を8で割り切れる数に切り捨てることは可能ですか?

  21. 21

    (変数によって)2つのロックされたスレッドが、それらの変数の1つを切り替えて、別のスレッドにアクセスしようとするとどうなりますか?

  22. 22

    フロートを特定の精度に切り捨てる方法は?

  23. 23

    doubleの値をintで割った値を切り捨てるにはどうすればよいですか?

  24. 24

    DoubleからNSNumberに変換し、Swiftで小数点以下6桁までの精度を維持する方法はありますか?

  25. 25

    動的に割り当てられた配列の最初の2つの数値を出力するのに問題があり、他の数値は正常に機能します

  26. 26

    2つの一時変数がありますが、PHPでそれらを比較するにはどうすればよいですか?

  27. 27

    C2つの文字列を比較するとメモリ割り当ての問題になります

  28. 28

    オーディオを png から stdout に変換するときの ffmpeg の問題ですが、ファイルには問題ありません

  29. 29

    Javaでdoubleを小数点以下2桁に切り捨てるにはどうすればよいですか?

ホットタグ

アーカイブ