Java中的浮點數四捨五入到小數點後2位的幾種方法

前言

四捨五入到2或3個小數位是我們Java程序員日常開發中肯定會遇到。幸運的是,Java API提供了幾種在Java中舍入數字的方法

我們可以使用Math.round()BigDecimalDecimalFormat將Java中的任何浮點數四捨五入到n個位置。我個人更喜歡使用BigDecimal在Java中四捨五入任何數字,因爲它具有便捷的API並支持多種舍入模式。 另外,如果您在金融行業工作,最好使用BigDecimal進行貨幣計算。

舍入數字時要記住的重要事項之一是舍入模式。 舍入模式決定了如何捨棄丟棄的分數,瞭解諸如HALF DOWNHALF UPHALF 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

在這裏插入圖片描述

還有其他一些舍入模式,例如UPDOWNFLOORCEILING,這也是值得了解的。

2.使用BigDecimal將數字四捨五入到小數點後兩位

每當我需要將數字四捨五入到小數點後n位時,我首先想到的是BigDecimalBigDecimal不僅允許您選擇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將數字四捨五入到小數點後兩位

如果僅出於顯示目的四捨五入數字,則應考慮使用DecimalFormatString``格式方法類。 儘管使用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中舍入數字的方法,例如BigDecimalDecimalFormatMath.round()。 由於便捷的API和對不同舍入模式的支持,BigDecimal看起來是舍入數字的最佳方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章