JavaRush /Java Blog /Random-TW /Java 中的四捨五入數字

Java 中的四捨五入數字

在 Random-TW 群組發布
浮點數(float、double)用於計算需要小數精度的表達式。會計和其他計算操作通常需要高精度。 Java 中的四捨五入數字 - 1但是我們總是需要小數點後面的數字長「尾巴」嗎?也許三個實部的精度對我們來說就夠了?我們對這個選項很滿意,如何正確地進行捨入呢?這正是我們今天要討論的內容:我們將研究在 Java 中對數字進行舍入的方法

字串格式

作為第一種方法,我們將研究舍入雙精度:
double value = 34.766674;
String result = String.format("%.3f",value);
System.out.print(result);//  34,767
結果,我們將以3 位小數的精度格式化浮點數 34766674 ,因為在格式化指令中我們指定了 3 位小數“%.3f。反過來,格式化字串時的 %f 表示浮點類型數字,包括Java中的資料類型doublefloat。在上面的例子中,我們將結果值輸出到控制台。現在的問題是:我們如何縮短它?很簡單:你需要使用printf,而printf又就是格式+列印,這樣一來,前面我們的例子就會簡化為:
double value = 34.766674;
System.out.printf("%.3f",value);
除了這個方法之外, PrintStream類別 的out實例還有一個format方法,其工作原理類似:
double value = 34.766674;
System.out.format("%.3f",value);
舍入發生在HALF_UP 模式中- 朝更接近被截斷的數字(0 或 10)進行舍入。如果這些數字等距(在 5 的情況下),則向上捨入。例子:
String firstResult = String.format("%.3f",7.0004);// 7,000
String secondResult = String.format("%.3f",7.0005);// 7,001
String thirdResult = String.format("%.3f",7.0006);// 7,001
我們將在下面更詳細地討論舍入模式。 Java 中的四捨五入數字 - 2

十進位格式

另一種選擇是使用DecimalFormat類別。它旨在格式化 Java 中的任何數字,無論是整數還是浮點數。當我們實例化DecimalFormat 時,我們可以向它傳遞一個格式字串。它將指示要為輸入設定格式的小數位數。這就是我們使用DecimalFormat 的範例:
double value = 34.766674;
DecimalFormat decimalFormat = new DecimalFormat( "#.###" );
String result = decimalFormat.format(value);
System.out.print(result);//34,767
#.### 行是一種模式,指示我們將傳遞的值格式化為小數點後 3 位。若要在建立 DecimalFormat 物件後變更模式,可以使用其applyPatternapplyLocalizedPattern方法:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
decimalFormat.applyPattern("#.#");
decimalFormat.applyLocalizedPattern("#.#####");
但今天我們討論的是捨入,不是嗎?當截斷小數位數超出指定模式的數字時,如果最後截斷的數字大於 5,則DecimalFormat會將數字向上捨入。但是如果數字是 5 呢?事實證明,它恰好位於最接近的整數之間的中間。然後怎樣呢?在這種情況下,會考慮先前的數字。如果是偶數,則進行舍入:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4565);
System.out.println((result));// 7,457
如果是奇數,則不執行:
DecimalFormat decimalFormat = new DecimalFormat("#.###");
String result = decimalFormat.format(7.4575);
System.out.println((result));// 7,457
使用 String.format() 和 DecimalFormat.format() 格式化浮點數之間存在細微差別。即使沒有小數部分,第一個也將始終列印尾隨零。例如:
String firstResult = String.format("%.3f", 7.000132);
System.out.println((firstResult)); // 7.000

DecimalFormat decimalFormat = new DecimalFormat("#.###");
String secondResult = decimalFormat.format(7.000132);
System.out.println((secondResult));  // 7
我們可以看到,當將數字 7.000132 格式化為小數點後三位時,String 的 format() 方法將輸出 7.000,而 DecimalFormat 的 format() 方法將輸出 7。也就是說,您可以選擇String.format( )DecimalFormat。)取決於您是否需要尾隨零。使用上述方法,我們收到了字串形式的結果。讓我們看看如何準確地傳回數值。

數學

不能不提到一個為各種數字算術運算量身定制的特殊類 - MathJava 中的四捨五入數字 - 3該類別還具有捨入方法,但與已經描述的方法不同,它們不允許您設定一定數量的小數位數,而是捨入為整數:
  • Math.ceil()向上捨入到最接近的整數,但傳回的不是整數類型,而是雙精度數:

    double value = 34.777774;
    double result = Math.ceil(value);
    System.out.println((result)); //35.0

    即使我們有 34.0000000,使用Math.ceil後我們仍然會得到 35.0。

    Math.floor() 向下舍入到最接近的整數,同時返回雙精度結果:

    double value = 34.777774;
    double result = Math.floor(value);
    System.out.println((result)); //34.0

    同樣,即使我們的值為 34.999999999,那麼使用Math.floor後我們將得到 34.0。

  • Math.round () - 四捨五入到最接近的整數,給出結果 int:

    double value = 34.777774;
    int result = Math.round(value);
    System.out.println((result)); //35

    如果我們的數字是 34.5,則四捨五入為 35,但如果略小於 34.499,則該數字將被截斷為 34。

    為了不是簡單地截掉整個實部,而是將此過程調節到一定數量的小數位,同時將該數字乘以 10^n(10 的 n 次方),其中 n等於所需的小數位數。之後,使用Math類的一些方法進行舍入,然後再次除以 10^n:

    double value = 34.777774;
    double scale = Math.pow(10, 3);
    double result = Math.ceil(value * scale) / scale;
    System.out.println((result)); //34.778

    Math.pow - 採用兩個參數。第一個是數字,第二個是需要提升到的功率。

使用 BigDecimal 舍入

BigDecimal是一個允許您使用浮點數的類別。特別是,它的主要特徵是可以儲存任意長度的小數(即數字的範圍沒有限制)。此外,該類別還儲存各種算術處理方法,包括舍入。可以透過將建構函式設定為 double、顯示浮點數的 string、double 和MathContext等來建立該物件的類別。 MathContext是RoundingMode和描述搜尋值中總位數的數字的組合。舍入規則 RoundingMode: 向下- 向零捨入。 UP-從零模式舍入。 CEILING - 向正無窮大捨去。 FLOOR - 朝負無窮大捨去。 HALF_UP - 如果兩個鄰居不等距(即,當捨去的數字為 5 時),請捨入到「最近的鄰居」。在這種情況下,執行向上舍入。 HALF_DOWN - 向「最近的鄰居」捨入。如果兩個鄰居不等距,則在這種情況下向下舍入。 HALF_EVEN - 如果兩個鄰居不等距,則四捨五入到「最近的鄰居」。在這種情況下,捨去到偶數鄰居(如上述 DecimalFormat 中所述)。 UNNECESSARY - 用於確認要求的操作具有正確的結果。因此,不需要四捨五入。例子:
MathContext context = new MathContext(5, RoundingMode.HALF_UP);
double value = 34.777554;
BigDecimal result = new BigDecimal(value, context);
System.out.println(result); //34.778
除了能夠在建構函式中設定舍入規則之外,BigDecimal還允許您在建立實例後設定舍入模式。為此,請使用setScale方法,在該方法中您需要設定小數位數和舍入規則:
double value = 34.777554;
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, RoundingMode.DOWN);
System.out.println(result); //34.777
BigDecimal 還具有內部int變量,旨在設定舍入模式(ROUND_DOWNROUND_CEILINGROUND_FLOOR ...),這些變量表示與RoundingMode類別中提供的捨入規則類似的捨入規則,並且在setScale中也有類似的使用:
BigDecimal result = new BigDecimal(value);
result = result.setScale(3, BigDecimal.ROUND_DOWN);
在本文 中閱讀有關 BigDecimal 類的更多資訊。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION