import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class NumberFormatDemo {
public static void main(String[] args) {
// BigDecimal
// 保留两位小数
System.out.println(new BigDecimal(0.2).setScale(, BigDecimal.ROUND_HALF_UP).doubleValue());// 0.2
System.out.println(new BigDecimal(0.235).setScale(, BigDecimal.ROUND_HALF_UP).doubleValue());// 0.23
System.out.println(new BigDecimal(0.2351).setScale(, BigDecimal.ROUND_HALF_UP).doubleValue());// 0.24
System.out.println(new BigDecimal().setScale(, BigDecimal.ROUND_HALF_UP).doubleValue());// 42.0 // NumberFormat
// 保留两位小数,个位无数字填充0
NumberFormat nformat = NumberFormat.getNumberInstance();
nformat.setMaximumFractionDigits();
System.out.println(nformat.format(0.2));// 0.2
System.out.println(nformat.format(0.235));// 0.23
System.out.println(nformat.format(0.2351));// 0.24
System.out.println(nformat.format());// 42 // DecimalFormat,是NumberFormat的具体实现子类
// 保留两位小数,对应位上无数字填充0
DecimalFormat df = new DecimalFormat("#0.00");
System.out.println(df.format(0.2));// 0.20
System.out.println(df.format(0.235));// 0.23
System.out.println(df.format(0.2351));// 0.2, 因为0.2351在0.23-0.24之间,距离0.24更近,所以输出0.24
System.out.println(df.format());// 42.00 DecimalFormat df4 = new DecimalFormat();
// #:位置上无数字不显示
df4.applyPattern("#.##");
System.out.println(df4.format(345235.0));// 345235
// 0:位置上无数字显示0
df4.applyPattern("0.00");
System.out.println(df4.format(345235.0));// 345235.00
// 加负数显示
df4.applyPattern("-0.00");
System.out.println(df4.format(345235.34567));// -345235.35
// 逗号分隔
df4.applyPattern("-0,000.00");
System.out.println(df4.format(345235.34567));// -345,235.35
// 百分位
df4.applyPattern("0.00%");
System.out.println(df4.format(0.34567));// 34.57%
// 千分位
df4.applyPattern("0.00\u2030");
System.out.println(df4.format(0.34567));// 345.67‰
// 科学计数法,E之前是底数的格式,E之后的是指数的格式
df4.applyPattern("0.00E00");
System.out.println(df4.format(2342.444));// 2.34E03
// 格式后面加单位符号
df4.applyPattern("0.00 KG");
System.out.println(df4.format(2342.444));// 2342.44 KG
df4.applyPattern("0.00 QA");
System.out.println(df4.format(2342.444));// 2342.44 QA
// 使用舍入模式:ROUND_HALF_EVEN,
// 保留位数是奇数,使用ROUND_HALF_DOWN
// 保留位数是偶数,使用ROUND_HALF_UP
System.out.println(df4.format(2342.435));// 2342.43 QA
System.out.println(df4.format(2342.445));// 2342.45 QA // String.format
// 保留两位小数,个位数及小数点后两位无数字填充0,四舍五入
System.out.println(String.format("%.2f", 0.2));// 0.20
System.out.println(String.format("%.2f", 0.235));// 0.24
System.out.println(String.format("%.2f", 0.236));// 0.24
System.out.println(String.format("%.2f", 42.0));// 42.00
}
}

BigDecimal工具类
总所周知,java在浮点型运算时是非精确计算,如下demo

System.out.println(0.05 + 0.01);// 0.060000000000000005
System.out.println(1.0 - 0.42);// 0.5800000000000001
System.out.println(4.015 * 100);// 401.49999999999994
System.out.println(123.3 / 100);// 1.2329999999999999
1
2
3
4
在商业运算中,这点微小的误差有可能造成非常严重的后果。
所以在商业应用开发中,涉及金额等浮点数计算的数据,全部使用BigDecimal进行加减乘除计算

BigDecimal工具类代码:
import java.math.BigDecimal;
public class BigDecimalUtil {
// 默认除法运算精度
private static final int DEFAULT_DIV_SCALE = 5;

/**
* 提供精确的加法运算
*
* @param v1
* @param v2
* @return
*/
public static double add(double v1, double v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.add(b2).doubleValue();
}

public static String add(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.add(b2).toString();
}

/**
* 提供精确的减法运算
*
* @param v1
* @param v2
* @return
*/
public static double subtract(double v1, double v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.subtract(b2).doubleValue();
}

public static String substract(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.subtract(b2).toString();
}

/**
* 提供精确的乘法运算
*
* @param v1
* @param v2
* @return
*/
public static double multiply(double v1, double v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.multiply(b2).doubleValue();
}

public static String multiply(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.multiply(b2).toString();
}

/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入,舍入模式采用ROUND_HALF_UP
*
* @param v1
* @param v2
* @return 两个参数的商
*/
public static double divide(double v1, double v2) {
return divide(v1, v2, DEFAULT_DIV_SCALE);
}

/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。舍入模式采用ROUND_HALF_UP
*
* @param v1
* @param v2
* @param scale
* 表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static double divide(double v1, double v2, int scale) {
return divide(v1, v2, scale, BigDecimal.ROUND_HALF_UP);
}

/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。舍入模式采用用户指定舍入模式
*
* @param v1
* @param v2
* @param scale
* 表示需要精确到小数点以后几位
* @param round_mode
* 表示用户指定的舍入模式
* @return 两个参数的商
*/
public static double divide(double v1, double v2, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2, scale, round_mode).doubleValue();
}

/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入,舍入模式采用ROUND_HALF_EVEN
*
* @param v1
* @param v2
* @return 两个参数的商,以字符串格式返回
*/
public static String divide(String v1, String v2) {
return divide(v1, v2, DEFAULT_DIV_SCALE);
}

/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。舍入模式采用ROUND_HALF_UP
*
* @param v1
* @param v2
* @param scale
* 表示需要精确到小数点以后几位
* @return 两个参数的商,以字符串格式返回
*/
public static String divide(String v1, String v2, int scale) {
return divide(v1, v2, scale, BigDecimal.ROUND_HALF_UP);
}

/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。舍入模式采用用户指定舍入模式
*
* @param v1
* @param v2
* @param scale
* 表示需要精确到小数点以后几位
* @param round_mode
* 表示用户指定的舍入模式
* @return 两个参数的商,以字符串格式返回
*/
public static String divide(String v1, String v2, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.divide(b2, scale, round_mode).toString();
}

/**
* 提供精确的小数位四舍五入处理,舍入模式采用ROUND_HALF_EVEN
*
* @param v
* 需要四舍五入的数字
* @param scale
* 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v, int scale) {
return round(v, scale, BigDecimal.ROUND_HALF_UP);
}

/**
* 提供精确的小数位四舍五入处理
*
* @param v
* 需要四舍五入的数字
* @param scale
* 小数点后保留几位
* @param round_mode
* 指定的舍入模式
* @return 四舍五入后的结果
*/
public static double round(double v, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
return b.setScale(scale, round_mode).doubleValue();
}

/**
* 提供精确的小数位四舍五入处理,舍入模式采用ROUND_HALF_UP
*
* @param v
* 需要四舍五入的数字
* @param scale
* 小数点后保留几位
* @return 四舍五入后的结果,以字符串格式返回
*/
public static String round(String v, int scale) {
return round(v, scale, BigDecimal.ROUND_HALF_UP);
}

/**
* 提供精确的小数位四舍五入处理
*
* @param v
* 需要四舍五入的数字
* @param scale
* 小数点后保留几位
* @param round_mode
* 指定的舍入模式
* @return 四舍五入后的结果,以字符串格式返回
*/
public static String round(String v, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(v);
return b.setScale(scale, round_mode).toString();
}
}

BigDecimal 舍入模式(Rounding mode)介绍:
ROUND_CEILING
向正无穷方向舍入
ROUND_DOWN
向零方向舍入
ROUND_FLOOR
向负无穷方向舍入
ROUND_HALF_DOWN
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用: : ROUND_HALF_DOWN如果是偶数,使用ROUND_HALF_UP
ROUND_HALF_UP
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6
ROUND_UNNECESSARY
计算结果是精确的,不需要舍入模式
ROUND_UP
向远离0的方向舍入

https://blog.csdn.net/mglgcx/article/details/78560029?locationNum=10&fps=1

http://www.hollischuang.com/archives/618

BigDecimal四舍五入保留两位小数的更多相关文章

  1. 19-6/24作业: 将一个double类型的小数,按照四舍五入保留两位小数

    ☞要求 将一个double类型的小数,按照四舍五入保留两位小数 ☞实现方式 1.获得一个double类型的小数 2.使用BigDecimal包的setScale进行操作 3.输出结果 ☞代码内容 pa ...

  2. Java中四舍五入保留两位小数

    Java中四舍五入保留两位小数 方法一 四舍五入 double f = 3.15; long res = Math.round(f); #结果 res = 3 保留两位小数 double f = 3. ...

  3. JS四舍五入保留两位小数

    //四舍五入保留2位小数(若第二位小数为0,则保留一位小数) function keepTwoDecimal(num) { var result = parseFloat(num); if (isNa ...

  4. 【0624课外作业】将一个double类型的小数,四舍五入保留两位小数

    package com.work0624; /** * 课外作业 *将一个double类型的小数,四舍五入保留两位小数 * @author L * */ import java.util.Scanne ...

  5. Oracle中,利用sql语句中的函数实现保留两位小数和四舍五入保留两位小数

    Oracle中,利用sql语句中的函数实现保留两位小数和四舍五入保留两位小数: select trunc(1.23856789,2) from dual round(m,n) 可以四舍五入 trunc ...

  6. 装饰者模式的学习(c#) EF SaveChanges() 报错(转载) C# 四舍五入 保留两位小数(转载) DataGridView样式生成器使用说明 MSSQL如何将查询结果拼接成字符串 快递查询 C# 通过smtp直接发送邮件 C# 带参访问接口,WebClient方式 C# 发送手机短信 文件 日志 写入 与读取

    装饰者模式的学习(c#) 案例转自https://www.cnblogs.com/stonefeng/p/5679638.html //主体基类 using System;using System.C ...

  7. js 让小数四舍五入保留两位小数的函数是?

    js 让小数四舍五入保留两位小数的函数是? 例子:data.relations[i].data[j].toFixed(2) toFixed(2)这个函数就是保留两位小数的作用

  8. C# 传统四舍五入保留两位小数(网上流传好多错误的版本)

    关于C#里面的Math.Round,很多人都会用到,而且以为是四舍五入,其实不是这样的: C#里面的Math.Round是符合IEEE标准的“四舍五入”,其实是五舍六入. 网上好多流传的下面这种方式实 ...

  9. sql 四舍五入保留两位小数

    select convert(decimal(18, 2), 362315 * 1.0 / 10000) 1. ROUND(该函数,只是负责四舍五入到两位小数,但是不负责截断 只留两位小数,例如下例: ...

随机推荐

  1. BZOJ4992 [Usaco2017 Feb]Why Did the Cow Cross the Road 最短路 SPFA

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4992 题意概括 在一幅n*n的地图上,Amber从左上角走到右下角,每走一步需要花费时间t,每走完 ...

  2. 开发一个支持多用户同时在线的FTP程序

    FTP 要求: .用户加密认证 .允许同时多用户登录 .每个用户有自己的家目录,且只能访问自己的家目录 .对用户进行磁盘配额,每个用户的可用空间不同 .允许用户在ftp server上随意切换目录 . ...

  3. 096实战 在windows下新建maven项目

    1.拷贝settings到.m2文件下 2.修改文件 3.新建Project项目 4.转换为maven项目 config下转换 5.拷贝pom文件 <project xmlns="ht ...

  4. 63:二叉搜索树的第k个结点

    /** * 面试题63:二叉搜索树的第k个结点 * 给定一颗二叉搜索树,请找出其中的第k大的结点 * 例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. ...

  5. jupyter notebook connecting to kernel problem

    前几天帮同学配置 python 和 anaconda 环境,在装 jupyter notebook 时,出了点问题,搞了一天半终于搞好了,也是在 github 里找到了这个问题的解答. 当时显示的是无 ...

  6. 谈谈MySQL无法连接的原因和分析方法

    [可能的原因] MySQL无法连接的原因有很多,比如: 1.数据库的请求量突增,实例连接数超过max_connections,或用户连接数超过max_user_connections, 这种情况连接时 ...

  7. grant 权限 on 数据库对象 to 用户

    grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant select on testdb.* to common_ ...

  8. 提取IPv6地址的编码信息

    提取IPv6地址的编码信息   为了保持兼容和地址转化,很多IPv6地址将额外的信息编码到地址信息中,如IPv4地址和Mac地址.在Nmap中,可以使用address-info脚本提取内嵌的信息,并进 ...

  9. django-访问控制

    django自带的用户认证系统提供了访问控制的的功能.   1.只允许登录的用户登录   django的用户可分为两类,一是可认证的用户,也就是在django.contrib.auth.models. ...

  10. Java并发程序设计(十三)锁的性能优化

    锁的性能优化 一.优化注意事件 一)减少锁的持有时间 只在必要时进行同步,能明显减少锁的持有时间. 二)锁的细化 缺陷:当系统需要全局锁时,其消耗的资源会比较多. 三)锁的分离 比如读写分离锁 四)锁 ...