前言
四捨五入到2或3個小數位是我們Java程序員日常開發中肯定會遇到。幸運的是,Java API提供了幾種在Java中舍入數字的方法
我們可以使用Math.round()
,BigDecimal
或DecimalFormat
將Java中的任何浮點數四捨五入到n個位置。我個人更喜歡使用BigDecimal
在Java中四捨五入任何數字,因爲它具有便捷的API
並支持多種舍入模式。 另外,如果您在金融行業工作,最好使用BigDecimal
進行貨幣計算。
舍入數字時要記住的重要事項之一是舍入模式
。 舍入模式決定了如何捨棄丟棄的分數,瞭解諸如HALF DOWN
,HALF UP
和HALF EVEN
之類的流行舍入模式肯定會有所幫助。
相關知識點
1.Java中的舍入模式
在四捨五入之前要知道的重要一點是四捨五入模式。 通常,程序員認爲,如果最後一位小於5,則捨去,如果最後一位大於5,則舍入;
舍入模式決定應如何舍入最低有效位。 BigDecimal
類具有定義爲整數常量的舍入模式,此模式後來被Java 1.5中的RoundingMode
枚舉所取代。 以下是一些要記住的重要RoundingMode
:
RoundingMode.HALF_DOWN
:如果兩個鄰居等距,則向下舍入,例如2.5將舍入爲2.0
RoundingMode.HALF_UP
:如果兩個鄰居的距離相同則向上舍入,例如2.5將舍入爲3.0
RoundingMode.HALF_EVEN
:如果兩個鄰居等距,則向偶數舍入,例如2.5將舍入到2.0,而5.5將舍入到6.0
還有其他一些舍入模式,例如UP
,DOWN
,FLOOR
和CEILING
,這也是值得了解的。
2.使用BigDecimal將數字四捨五入到小數點後兩位
每當我需要將數字四捨五入到小數點後n位時,我首先想到的是BigDecimal
。 BigDecimal
不僅允許您選擇RoundingMode
,而且使用BigDecimal
方法將數字四捨五入到任何小數位都很容易。 這是一個將數字四捨五入到小數點後兩位的示例:
package com.milo.base.sort;
import org.junit.Test;
import java.math.BigDecimal;
/**
* 測試BigDecimal的Api
* @author milogenius
* @date 2020-04-14 19:49
*/
public class BigDecimalTest {
@Test
public void test1(){
float number = BigDecimal.valueOf(4.526f)
.setScale(2, BigDecimal.ROUND_HALF_DOWN)
.floatValue();
System.out.println(number);
}
}
----------------------------------------------
Output:
4.53
在setScale()
中,您可以指定需要舍入的小數位數,在這裏,我們將小數位數設置爲2,因爲我們將舍入到2位數字。 我們指定舍入模式ROUND_HALF_DOWN
,類似於RoundingMode.HALF_DOWN
。 您也可以使用RoundingMode.HALF_DOWN
來代替BigDecimal.ROUND_HALF_DOWN
,但是要注意,從Java 5開始添加了RoundingMode
枚舉。
3.使用DecimalFormat將數字四捨五入到小數點後兩位
如果僅出於顯示目的四捨五入數字,則應考慮使用DecimalFormat
或String``格式方法類
。 儘管使用BigDecimal
舍入數字沒有錯,但DecimalFormat
似乎是格式化數字的正確類。
這是Java代碼,使用Java中的DecimalFormat
將數字四捨五入到2位有效數字。
@Test
public void test2(){
DecimalFormat df = new DecimalFormat("#.00");
float number = Float.valueOf(df.format(4.526f));
System.out.println(number);
}
----------------------------------------------
Output:
4.53
#.00
用於四捨五入到小數點後兩位,如果要四捨五入到小數點後第三位,只需使用#.000
或#.0000
來創建DecimalFormat
。 要了解有關格式化數字的更多信息,請參見如何使用DecimalFormat
在Java中格式化數字。
4.使用Math.round()在Java中進行舍入運算
Math.round()
是Java中舍入數字的經典方法。 儘管它沒有提供任何API
來指定要舍入的位數,但是通過使用乘法和除法,您可以將其舍入到n或2個小數位。
順便說一句,這不是Java中舍入數字的首選方法,我更喜歡BigDecimal
,但仍然是舍入數字的便捷方法,並且可以在許多情況下使用。 這是在Java中如何使用Math.round()
函數將數字四捨五入到2位數字的方法。
@Test
public void test3(){
float rounded = (float) Math.round(4.526f*100)/100;
System.out.println(rounded);
}
----------------------------------------------
Output:
4.53
如果需要四捨五入到小數點後五位,我們乘以100來四捨五入,然後乘以100000。順便說一句,Java的最佳實踐是優先使用BigDecimal
而不是Math.round()
來對Java中的數字進行四捨五入
綜合案例
這是一個Java綜合案例,它結合了以上3種方法,可以將Java中的任何數字四捨五入到小數點後兩位。 您可以將程序更改爲最多三位,四位或任意位數。
package com.milo.base.sort;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Arrays;
/**
* 使用三種方式演示java中保留2位小數
* 包括 BigDecimal,
* Math.round and DecimalFormat class.
* @author milogenius
*/
public class RoundingNumbers {
public static void main(String args[]) {
//數據
float[] samples = new float[]{2.123f, 2.125f, 2.127f};
//使用 Match.round()保留2位小數
float[] rounded = round(samples);
System.out.println("開始舍入, numbers: "
+ Arrays.toString(samples));
System.out.println("結束舍入 : 使用Match.round()方法 "
+ Arrays.toString(rounded));
//使用BigDecimal保留2位小數
//我們可以使用不同的舍入模式e.g., HALF_UP, HALF_DOWN,and HALF_EVEN with BigDecimal
rounded = roundUsingBigDecimal(samples);
System.out.println("開始舍入,numbers : "
+ Arrays.toString(samples));
System.out.println("結束舍入, number 使用 BigDecimal: "
+ Arrays.toString(rounded));
//DecimalFormat Example to round number to 2 digits
//使用DecimalFormat來保留2位小數
rounded = roundUsingDecimalFormat(samples);
System.out.println("開始舍入numbers: "
+ Arrays.toString(samples));
System.out.println("結束舍入,使用DecimalFormat: "
+ Arrays.toString(rounded));
}
/**
* 使用 Math.round保留2爲小數
* @param numbers
* @return
*/
public static float[] round(float[] numbers) {
float[] round = new float[numbers.length];
for (int i = 0; i < numbers.length; i++) {
float number = numbers[i];
round[i] = (float) Math.round(number * 100) / 100;
}
return round;
}
/**
* 使用BigDecimal保留2爲小數
* @param digits
* @return
*/
public static float[] roundUsingBigDecimal(float[] digits) {
float[] result = new float[digits.length];
for (int i = 0; i < digits.length; i++) {
float digit = digits[i];
result[i] = BigDecimal.valueOf(digit)
.setScale(2, BigDecimal.ROUND_HALF_DOWN)
.floatValue();
}
return result;
}
/**
* 使用DecimalFormat保留2爲小數
* @param decimals
* @return
*/
public static float[] roundUsingDecimalFormat(float[] decimals) {
float[] rounded = new float[decimals.length];
//DecimalFormat to round numbers to 2 decimal place
DecimalFormat df = new DecimalFormat("#.00");
for (int i = 0; i < decimals.length; i++) {
float decimal = decimals[i];
rounded[i] = Float.valueOf(df.format(decimal));
}
return rounded;
}
}
總結
綜上所述,就是如何在Java中將數字四捨五入到小數點後2位。 我們已經看到3種在Java中舍入數字的方法,例如BigDecimal
,DecimalFormat
和Math.round()
。 由於便捷的API
和對不同舍入模式的支持,BigDecimal
看起來是舍入數字的最佳方法。