在 Java 中列印不含科學記數法的雙精度值
一、簡介
在日常任務中,我們可能經常會遇到格式化雙值的挑戰。其中一項挑戰可能是列印雙值,避免使用科學記數法。儘管這種方法可以幫助我們更緊湊地表達大值和小值,但在某些情況下,預設的科學記數法可能不是最實用的選擇。在這種情況下,可能需要考慮替代方法以獲得更合適的表示。
在本教程中,我們將探索在 Java 中列印不帶科學記數法的雙精度值的各種方法。
2. 關於科學記數法
科學記數法由兩個部分組成:係數和指數。通常,1 到 10 之間的十進制數是係數,而指數表示系統乘以該係數的 10 次方。
在Java中,科學計數法通常使用“e”
表示法來表示,其中“e”
代表指數:
double largeNumber = 256450000d;
System.out.println("Large Number: " + largeNumber);
double smallNumber = 0.0000046d;
System.out.println("Small Number: " + smallNumber);
運行上面的程式碼將向控制台輸出兩個用科學記數法表示的數字:
Large Number: 2.5645E8
Small Number: 4.6E-6
第一個數字以“e”
表示法表示為 2.5645 * 10 8 ,第二個數字表示為 4.6 * 10 -6 。這種緊湊的寫法可以給我們很多幫助,但也可能誤導我們。因此,在下文中,我們將看到一些消除它的方法。
3.使用DecimalFormat
類
我們可以使用DecimalFormat
類別輕鬆控制數值的顯示方式。此外,它還允許我們指定格式模式。我們可以定義所需的小數位和其他格式詳細資訊以滿足我們應用程式的要求:
DecimalFormat df = new DecimalFormat("#.###########");
double largeNumber = 256450000d;
System.out.println("Large Number: " + df.format(largeNumber));
double smallNumber = 0.0000046d;
System.out.println("Small Number: " + df.format(smallNumber));
我們創建了一個由一系列特殊字元組成的模式,可能與文字結合。在我們的範例中,我們選擇了“#”字符,該字符在提供時顯示數字,否則不顯示任何內容。如果我們運行上面的程式碼,我們將在控制台上列印數字,而不使用科學記數法:
Large Number: 256450000
Small Number: 0.0000046
我們可以看到,即使我們只為整數部分放置一個字符,它也將始終被保留,無論模式是否小於實際數字。
4.使用printf()
方法
PrintStream
類別中的printf()
方法提供了一種動態且直接的方式來格式化輸出。它與傳統的 C 風格printf()
函數非常相似。
我們將使用%f
說明符來明確塑造浮點數的表示:
double largeNumber = 256450000d;
System.out.printf("Large Number: %.7f", largeNumber);
System.out.println();
double smallNumber = 0.0000046d;
System.out.printf("Small Number: %.7f", smallNumber);
在這種情況下,我們將輸出:
Large Number: 256450000.0000000
Small Number: 0.0000046
如果數字沒有小數,則會用零填滿小數位。另外,如果我們不指定小數位數,預設情況下它將列印六位小數。
如果我們在沒有明確指定小數位數的情況下列印我們的小數字:
System.out.printf("Small Number: %f", smallNumber);
由於該值的小數位數多於格式中指定的位數,因此printf()
方法將對值進行四捨五入:
Small Number: 0.000005
5.使用BigDecimal
在處理金融計算、科學計算或任何保持精度至關重要的應用程式時, BigDecimal
是理想的選擇。與原始資料類型或雙精度值不同,由於二進位浮點表示的固有限制,可能會導致精度損失, BigDecimal
允許我們指定所需的精確精度。
使用BigDecimal
時,科學記數法的概念本質上是不同的。這個類別本身允許我們處理任意精確度的數字,而無需借助科學記數法,為預設表示帶來的挑戰提供了直接的解決方案:
double largeNumber = 256450000d;
System.out.println("Large Number: " + BigDecimal.valueOf(largeNumber).toPlainString());
double smallNumber = 0.0000046d;
System.out.println("Small Number: " + BigDecimal.valueOf(smallNumber).toPlainString());
在此範例中,我們使用BigDecimal.valueOf()
方法將帶有科學計數法的 double 值轉換為BigDecimal
。隨後, toPlainString()
函數將複雜的物件轉換為可列印的字串,提供精確且易於解釋的表示形式。
除了消除科學記數法之外, BigDecimal
還提供可自訂舍入模式等功能,這在金融應用中至關重要。 BigDecimal 能夠精確控制小數位數並處理極大或極小的數字,這使得BigDecimal
成為優先考慮 Java 應用程式準確性和精度的開發人員的首選。
6. 使用String.format()
String.format()
方法使用格式字串和參數塑造String
。
**St** ring.format()
和printf()
方法都使用java.util.Formatter
類,並共享確切的格式化底層機制,提供了一種產生結構良好的輸出的便捷方法。然而,它們的應用和用法存在著細微的差異。
double largeNumber = 256450000d;
String formattedLargeNumber = String.format("%.7f", largeNumber);
System.out.println("Large Number: " + formattedLargeNumber);
double smallNumber = 0.0000046d;
String formattedSmallNumber = String.format("%.7f", smallNumber);
System.out.println("Small Number: " + formattedSmallNumber);
從上面的範例可以看出, String.format()
方法傳回一個格式化的字串,而不是直接將其列印到控制台。我們可以將格式化的字串儲存在變數中,從而使我們更容易進一步處理它或在不同的上下文中使用它。兩種方法共用相同的格式說明符,因此它們之間的格式化語法保持一致。
七、結論
在本文中,我們看到了在列印雙精確度值時避免使用科學記數法的多種方法。更重要的是,我們已經看到了許多使用不同方法來格式化數字(無論大小)的方法。我們也使用了格式說明符來確保我們所需的細節程度。
最終,方法之間的選擇取決於個人喜好和任務的特定需求。與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。