Java DecimalFormat 格式化数字,取2位小数,按位取小数,按要求格式化小数 float,double,int,等类型都支持

2022-06-21 00:00:00 类型 小数 格式化

关于double,float,等那些个小数类型的数字如何保留2位小数,如何取整,按要求保留小数,如何四舍五入,如何向上取整,如何向下取整。各种姿势的格式化小数。我这做个总结。

搜索的结果都差不多吧,但是都没有测试结果可以看,然后我就来总结一下,顺便留下测试的过程代码和结果。
算是留个记录吧,以备后用。
不要说先乘以10000再除以10000啥的,都不科学。
话不多说,看法宝!!!

package com.lxk.formatTest;

import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * 数字格式化测试
 * <p>
 *
 * @author lxk on 2017/1/22
 */
public class NumberFormatTest {
    public static void main(String[] args) {
        Float result;
        //result = 9.313226E-10,也就是0.0000000009313226
        //result = ((float) 1L) / (1024L * 1024L * 1024L);
        result = 1230.555F;
        //result = 1230.466F;
        System.out.println("-------------我是分界线-------------");
        showFormat(result);
        //result = 10.5F;
        result = 10.4F;
        System.out.println("-------------我是分界线-------------");
        showFormatMore(result);
    }

    /**
     * 测试各种舍入模式的不同
     *
     * @param result 待格式化的参数
     */
    private static void showFormatMore(Float result) {
        System.out.println("初始值:" + result.toString());
        DecimalFormat decimalFormat = new DecimalFormat("0");
        decimalFormat.setRoundingMode(RoundingMode.HALF_EVEN);
        System.out.println("HALF_EVEN:" + decimalFormat.format(result));
        decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
        System.out.println("HALF_UP:" + decimalFormat.format(result));
        decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
        System.out.println("HALF_DOWN:" + decimalFormat.format(result));
        decimalFormat.setRoundingMode(RoundingMode.FLOOR);
        System.out.println("FLOOR:" + decimalFormat.format(result));
        decimalFormat.setRoundingMode(RoundingMode.CEILING);
        System.out.println("CEILING:" + decimalFormat.format(result));
        decimalFormat.setRoundingMode(RoundingMode.UP);
        System.out.println("UP:" + decimalFormat.format(result));
        decimalFormat.setRoundingMode(RoundingMode.DOWN);
        System.out.println("DOWN:" + decimalFormat.format(result));
    }

    /**
     * 打印数据遭格式化之后的效果(默认是HALF_EVEN,他不是四舍五入,)
     *
     * @param value 待格式化的参数
     */
    private static void showFormat(Float value) {
        System.out.println("初始值:" + value.toString());
        //取一位整数
        System.out.println(new DecimalFormat("0").format(value));
        //取一位整数和两位小数
        System.out.println(new DecimalFormat("0.00").format(value));
        //取两位整数和三位小数,整数不足部分以0填补
        System.out.println(new DecimalFormat("00.000").format(value));
        //取所有整数部分
        System.out.println(new DecimalFormat("#").format(value));
        //以百分比方式计数,并取两位小数
        System.out.println(new DecimalFormat("#.##%").format(value));
        //显示为科学计数法,并取五位小数
        System.out.println(new DecimalFormat("#.#####E0").format(value));
        //显示为两位整数的科学计数法,并取四位小数
        System.out.println(new DecimalFormat("00.####E0").format(value));
        //每三位以逗号进行分隔。
        System.out.println(new DecimalFormat(",###").format(value));
        //将格式嵌入文本
        System.out.println(new DecimalFormat("所传入的格式化参数是:###大小。").format(value));
    }
}

然后就是上面代码的运行结果,如下:

《Java DecimalFormat 格式化数字,取2位小数,按位取小数,按要求格式化小数 float,double,int,等类型都支持》

注意,运行结果的1,和2的差别,1230.5和1230.55,两个在取整数的时候,一个是1230,一个是1231.说明这个默认的舍入模式,不是我们一般常见的四舍五入。具体看下面的说明吧。

DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置。

上面的例子包含了差不多所有的基本用法。

如果你想了解更多,请参考 DecimalFormat 类的文档。

下面是摘自jdk文档里面内容,虽然是1.6版本的,但是有这个类的中文介绍哟。

DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。

该类设计有各种功能,使其能够解析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。

它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。

舍入

DecimalFormat 提供 RoundingMode 中定义的舍入模式进行格式化。默认情况下,它使用 RoundingMode.HALF_EVEN。

同步

DecimalFormat 通常不是同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问某个格式,则必须保持外部同步。

关于
RoundingMode.HALF_EVEN的解释:

RoundingMode这个是个枚举类型,java.math包下。

有那么几个枚举常量,分别代表不同的舍入方式。下面简单介绍介个。

HALF_EVEN

向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为

同 RoundingMode.HALF_UP;如果为偶数,则舍入行为同 RoundingMode.HALF_DOWN。注意,在重复进行一系列计算时,此舍入模式可以在统计上将累加错误减到最小。

此舍入模式也称为“银行家舍入法”,主要在美国使用。此舍入模式类似于 Java 中对 float 和 double 算法使用的舍入策略。

HALF_UP

此舍入模式就是通常学校里讲的四舍五入。

HALF_DOWN

应该按上面的理解话,是五舍六入。

FLOOR

向负无限大方向舍入的舍入模式,此舍入模式始终不会增加计算值。白话文就是向下取整。

CEILING

向正无限大方向舍入的舍入模式。此舍入模式始终不会减少计算值。向上取整

UP

这个也是向上取整,但是,如果是坐标轴的话,这个都是远离零的方向取整,5.5->6; -2.5->-3

DOWN

这个也是向下取整,但是,如果是坐标轴的话,这个都是靠近零的方向取整,5.5->5; -2.5->-2

上面这些,记也记不住,用的时候,查一下再说吧。

《Java DecimalFormat 格式化数字,取2位小数,按位取小数,按要求格式化小数 float,double,int,等类型都支持》

看看这个例子,再理解一下上面的舍入的解释

    原文作者:请叫我大师兄_
    原文地址: https://blog.csdn.net/qq_27093465/article/details/54668012
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章