<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 在 Java 中比較浮點數或雙精度數的正確方法 > 原文: [https://howtodoinjava.com/java/basics/correctly-compare-float-double/](https://howtodoinjava.com/java/basics/correctly-compare-float-double/) 正確地**比較浮點**或**比較雙**不僅是 Java 特定的問題。 當今幾乎所有編程語言都可以觀察到它。 使用 [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754) 標準格式存儲浮點數和雙精度數。 實際的存儲和轉換如何工作,不在本文的討論范圍之內。 現在,只需了解在計算和轉換期間,可以在這些數字中引入*較小的舍入誤差*。 這就是為什么不建議僅依賴相等運算符(`==`)**比較浮點數**的原因。 讓我們學習**如何比較 Java** 中的浮點值。 ```java Table of Contents 1\. Simple comparison [Not recommended] 2\. Threshold based comparison [Recommended] 3\. Compare with BigDecimal [Recommended] ``` ## 1\. 雙精度比較 -- 簡單比較(不推薦) 首先看一下簡單比較,以了解用`==`運算符比較`double`到底有什么問題。 在給定的程序中,我使用兩種方法創建相同的浮點數(即`1.1`): 1. 添加`.1` 11 次。 2. 將`.1`乘以 11。 理論上,兩個操作都應產生數字`1.1`。 當我們比較這兩種方法的結果時,它應該匹配。 ```java private static void simpleFloatsComparison() { //Method 1 double f1 = .0; for (int i = 1; i <= 11; i++) { f1 += .1; } //Method 2 double f2 = .1 * 11; System.out.println("f1 = " + f1); System.out.println("f2 = " + f2); if (f1 == f2) System.out.println("f1 and f2 are equal\n"); else System.out.println("f1 and f2 are not equal\n"); } ``` 程序輸出。 ```java f1 = 1.0999999999999999 f2 = 1.1 f1 and f2 are not equal ``` 查看控制臺中打印的兩個值。 將`f1`計算為`1.0999999999999999`。 其舍入問題恰恰是內部引起的。 因此,不建議將**浮點數用`'=='`運算符進行比較**。 ## 2\. 雙精度比較 -- 基于閾值的比較[推薦] 現在,當我們知道相等運算符的問題時,讓我們解決它。 使用編程,我們無法更改存儲或計算這些浮點數的方式。 因此,我們必須采用一種解決方案,在該解決方案中,我們同意確定兩個可以容忍的值的差異,并且仍然認為數字相等。 該商定的值差被稱為**閾值**或`ε`。 因此,現在要使用“基于閾值的**浮點比較**”,我們可以使用`Math.abs()`方法計算兩個數字之間的差并將其與閾值進行比較。 ```java private static void thresholdBasedFloatsComparison() { final double THRESHOLD = .0001; //Method 1 double f1 = .0; for (int i = 1; i <= 11; i++) { f1 += .1; } //Method 2 double f2 = .1 * 11; System.out.println("f1 = " + f1); System.out.println("f2 = " + f2); if (Math.abs(f1 - f2) < THRESHOLD) System.out.println("f1 and f2 are equal using threshold\n"); else System.out.println("f1 and f2 are not equal using threshold\n"); } ``` 程序輸出: ```java f1 = 1.0999999999999999 f2 = 1.1 f1 and f2 are equal using threshold ``` ## 3\. 比較`double`與`BigDecimal`(推薦) 在[`BigDecimal`](https://docs.oracle.com/javase/10/docs/api/java/math/BigDecimal.html)類中,可以指定要使用的**舍入模式**和**精確度**。 使用精確的精度限制,可以解決舍入誤差。 最好的部分是`BigDecimal`數字是[不可變的](https://howtodoinjava.com/java/basics/how-to-make-a-java-class-immutable/),即,如果創建具有`"1.23"`值的`BigDecimal`,則該對象將保持`"1.23"`且不能更改。 此類提供了許多方法,可用于對其值進行數值運算。 您可以使用`compareTo()`方法與`BigDecimal`數字進行比較。 比較時會忽略比例。 > **`a.compareTo(b);`** > > 方法返回: > > -1 – 如果是`a < b` > > 0 – 如果`a == b` > > 1 – 如果是`a > b` 切勿使用`equals()`方法比較`BigDecimal`實例。這是因為此`equals`函數將比較比例。 如果比例不同,即使在數學上相同,`equals()`也將返回`false`。 Java 程序將`BigDecimal`類與`double`進行比較。 ```java private static void testBdEquality() { BigDecimal a = new BigDecimal("2.00"); BigDecimal b = new BigDecimal("2.0"); System.out.println(a.equals(b)); // false System.out.println(a.compareTo(b) == 0); // true } ``` 現在,為了驗證,讓我們使用`BigDecimal`類解決原始問題。 ```java private static void bigDecimalComparison() { //Method 1 BigDecimal f1 = new BigDecimal("0.0"); BigDecimal pointOne = new BigDecimal("0.1"); for (int i = 1; i <= 11; i++) { f1 = f1.add(pointOne); } //Method 2 BigDecimal f2 = new BigDecimal("0.1"); BigDecimal eleven = new BigDecimal("11"); f2 = f2.multiply(eleven); System.out.println("f1 = " + f1); System.out.println("f2 = " + f2); if (f1.compareTo(f2) == 0) System.out.println("f1 and f2 are equal using BigDecimal\n"); else System.out.println("f1 and f2 are not equal using BigDecimal\n"); } ``` 程序輸出: ```java f1 = 1.1 f2 = 1.1 f1 and f2 are equal using BigDecimal ``` 這就是**比較 Java** 中的浮點數的全部。 在評論部分分享您的想法。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看