目次
1。IEEE754フローティングポイント番号標準
なぜEpsilonを使用して比較するのですか?
<出>output:
:precision.equalsは、指定された許容範囲を使用して、組み込みエラーを簡単に処理するために、指定された許容範囲と比較できるようにします。
:bigdecimalは正確性を確保できますが、財務または重要な計算のパフォーマンスに影響を与える可能性があります。
ホームページ Java &#&チュートリアル なぜ二重の精度を失うのか、そしてjavaでそれを避ける方法

なぜ二重の精度を失うのか、そしてjavaでそれを避ける方法

Jan 27, 2025 pm 06:09 PM

Why double Loses Precision and How to Avoid It in Java

Javaでフローティングポイント数を使用する場合、2倍が事故または不正確な結果を生成することがあることに気付くかもしれません。この動作は、特に金融アプリケーションや高度の高度シナリオでエラーを引き起こす可能性があります。

この記事では、この問題の根本原因を調査し、それを回避する方法を説明し、実行可能な例を提供し、更新されたJavaバージョンがより良い代替ソリューションを提供するかどうかを議論します。

なぜ二重の精度が失われるのですか?

1。IEEE754フローティングポイント番号標準

Javaの二重データ型は、IEEE 754 Floating -Point番号計算標準に従います。次の方法を使用して、バイナリ形式で数値を表します。

シンボルの場合、

1桁

11桁
    インデックスに使用、
  • 52-スコア(テール番号)に使用される
  • このバイナリステートメントは、制限を導入しました:
  • 限られた精度:ダブルは最大15〜17ビットの小数を正確に表すことができます。
  • 取り込み誤差
:多くの小数スコア(例えば、0.1)をバイナリ番号として正確に表現することはできません。

たとえば、バイナリ:
  • 0.1は無制限のサイクル小数になり、ストレージのために遮断され、それによって軽度の不正確さが導入されます。
  • 2。算術操作における累積誤差 ダブルに伴う操作は、エラーが蓄積する可能性があります:

追加/削減方法が繰り返されると、エントリエラーが増幅されます。

    乗算/除去は、切り捨てにより精度を失う可能性があります。
この動作は、Javaユニークではなく、浮遊点数に固有のものです。

実行可能な例:double

によって引き起こされる精度の精度
    これはデモの問題の例です:
  • output:

result 0.30000000000000004は、バイナリ表現によって引き起こされる腐敗エラーを強調しています。違いがわずかに取るに足らない場合でも、キーシステムの大きな問題につながる可能性があります。

精度の損失を回避する方法

1。正確な計算にはbigdecimalを使用します
public class DoublePrecisionLoss {
    public static void main(String[] args) {
        double num1 = 0.1;
        double num2 = 0.2;
        double sum = num1 + num2;

        System.out.println("预期和:0.3");
        System.out.println("实际和:" + sum);

        // 比较
        if (sum == 0.3) {
            System.out.println("和等于0.3");
        } else {
            System.out.println("和不等于0.3");
        }
    }
}
ログイン後にコピー
ログイン後にコピー

JavaのBigdecimalクラスは、任意の精度算術を提供し、高い精度(金融コンピューティングなど)を必要とする理想的な選択肢となっています。 BigDecimalを使用する例:

<code>预期和:0.3
实际和:0.30000000000000004
和不等于0.3</code>
ログイン後にコピー
ログイン後にコピー

<出>output:


BigDecimalを使用することにより、精度の問題が排除され、正しい結果が比較されました。

2。epsilon値を使用して

を比較します

精度の損失に対処する別の方法は、浮動点の数を許容範囲(Epsilon)と比較することです。この方法では、正確な平等性に依存するのではなく、数値が「十分に近い」かどうかをチェックします。

Epsilon比較の使用例:

import java.math.BigDecimal;

public class BigDecimalExample {
    public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("0.1");
        BigDecimal num2 = new BigDecimal("0.2");
        BigDecimal sum = num1.add(num2);

        System.out.println("预期和:0.3");
        System.out.println("实际和:" + sum);

        // 比较
        if (sum.compareTo(new BigDecimal("0.3")) == 0) {
            System.out.println("和等于0.3");
        } else {
            System.out.println("和不等于0.3");
        }
    }
}
ログイン後にコピー
ログイン後にコピー

<出>output:

public class DoublePrecisionLoss {
    public static void main(String[] args) {
        double num1 = 0.1;
        double num2 = 0.2;
        double sum = num1 + num2;

        System.out.println("预期和:0.3");
        System.out.println("实际和:" + sum);

        // 比较
        if (sum == 0.3) {
            System.out.println("和等于0.3");
        } else {
            System.out.println("和不等于0.3");
        }
    }
}
ログイン後にコピー
ログイン後にコピー

なぜEpsilonを使用して比較するのですか?

  • <灵>柔軟性:組み込み誤差によって引き起こされる小さな違いを可能にします。
  • <单>シンプル
  • :この方法では、外部ライブラリを必要とせず、効率が高くなります。
Apache Commons Mathを使用して、精度を向上させます<」
Apache Commons Mathは、複雑な数学的コンピューティング用に設計されたライブラリです。 Bigdecimalのように任意の精度算術を提供しませんが、数値操作を簡素化し、場合によっては浮動ポイントエラーを最小限に抑える実用的な手順を提供します。

例:precision.equalsを使用して

を比較します

<出>output:

<code>预期和:0.3
实际和:0.30000000000000004
和不等于0.3</code>
ログイン後にコピー
ログイン後にコピー

なぜApache Commons Mathを使用するのですか?

import java.math.BigDecimal;

public class BigDecimalExample {
    public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("0.1");
        BigDecimal num2 = new BigDecimal("0.2");
        BigDecimal sum = num1.add(num2);

        System.out.println("预期和:0.3");
        System.out.println("实际和:" + sum);

        // 比较
        if (sum.compareTo(new BigDecimal("0.3")) == 0) {
            System.out.println("和等于0.3");
        } else {
            System.out.println("和不等于0.3");
        }
    }
}
ログイン後にコピー
ログイン後にコピー
単純化された比較

:precision.equalsは、指定された許容範囲を使用して、組み込みエラーを簡単に処理するために、指定された許容範囲と比較できるようにします。

    LightWeight
  • :ライブラリは、BigDecimalの費用を増やすことなく数値計算に焦点を当てたツールを提供します。
  • 要約 制限を理解する
  • :ダブル自体に欠陥はありませんが、バイナリの浮動小数点表現のため、高精度のタスクには適していません。

bigdecimal

:bigdecimalは正確性を確保できますが、財務または重要な計算のパフォーマンスに影響を与える可能性があります。

    ライブラリの使用
  • :Apache Commons Mathは、フローティングポイントの比較を効果的に処理できるPrecision.equalsなどの実用的なプログラムを提供します。
  • ダブルとその代替案を理解することにより、より堅牢でより正確なJavaアプリケーションを書くことができます。
  • ダブルの正確さとこれらの問題を解決する方法に遭遇した場合は、コメントで教えてください! ?

以上がなぜ二重の精度を失うのか、そしてjavaでそれを避ける方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? 会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? Apr 19, 2025 pm 04:51 PM

一部のアプリケーションが適切に機能しないようにする会社のセキュリティソフトウェアのトラブルシューティングとソリューション。多くの企業は、内部ネットワークセキュリティを確保するためにセキュリティソフトウェアを展開します。 ...

名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? 名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? Apr 19, 2025 pm 11:30 PM

多くのアプリケーションシナリオでソートを実装するために名前を数値に変換するソリューションでは、ユーザーはグループ、特に1つでソートする必要がある場合があります...

エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? Apr 19, 2025 pm 11:42 PM

データベース操作にMyBatis-Plusまたはその他のORMフレームワークを使用する場合、エンティティクラスの属性名に基づいてクエリ条件を構築する必要があることがよくあります。あなたが毎回手動で...

MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? Apr 19, 2025 pm 06:21 PM

システムドッキングでのフィールドマッピング処理は、システムドッキングを実行する際に難しい問題に遭遇することがよくあります。システムのインターフェイスフィールドを効果的にマッピングする方法A ...

Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Apr 19, 2025 pm 11:45 PM

intellijideaultimatiateバージョンを使用してスプリングを開始します...

Javaオブジェクトを配列に安全に変換する方法は? Javaオブジェクトを配列に安全に変換する方法は? Apr 19, 2025 pm 11:33 PM

Javaオブジェクトと配列の変換:リスクの詳細な議論と鋳造タイプ変換の正しい方法多くのJava初心者は、オブジェクトのアレイへの変換に遭遇します...

eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? Apr 19, 2025 pm 11:27 PM

eコマースプラットフォーム上のSKUおよびSPUテーブルの設計の詳細な説明この記事では、eコマースプラットフォームでのSKUとSPUのデータベース設計の問題、特にユーザー定義の販売を扱う方法について説明します。

Redisキャッシュソリューションを使用して、製品ランキングリストの要件を効率的に実現する方法は? Redisキャッシュソリューションを使用して、製品ランキングリストの要件を効率的に実現する方法は? Apr 19, 2025 pm 11:36 PM

Redisキャッシュソリューションは、製品ランキングリストの要件をどのように実現しますか?開発プロセス中に、多くの場合、ランキングの要件に対処する必要があります。

See all articles