zoukankan      html  css  js  c++  java
  • 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位时,我首先想到的是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将数字四舍五入到小数点后两位

    如果仅出于显示目的四舍五入数字,则应考虑使用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看起来是舍入数字的最佳方法。

    文章来源:Java知音公众号

    冷眉横对千夫指,俯首甘为孺子牛。
  • 相关阅读:
    买房的贷款时间是否是越长越好?https://www.zhihu.com/question/20842791
    asp.net cookie and session
    leelazero and google colab
    download file by python in google colab
    physical processor, core, logical processor
    通过powershell操作eventlog
    openxml in sql server
    get the page name from url
    How to Execute Page_Load() in Page's Base Class?
    Difference between HttpContext.Request and Request
  • 原文地址:https://www.cnblogs.com/yujian0817/p/12858705.html
Copyright © 2011-2022 走看看