java保留两位小数的方法

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(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 0.2
System.out.println(new BigDecimal(0.235).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 0.23
System.out.println(new BigDecimal(0.2351).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 0.24
System.out.println(new BigDecimal(42).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 42.0 // NumberFormat
// 保留两位小数,个位无数字填充0
NumberFormat nformat = NumberFormat.getNumberInstance();
nformat.setMaximumFractionDigits(2);
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));// 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));// 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

在商业运算中,这点微小的误差有可能造成非常严重的后果。 
所以在商业应用开发中,涉及金额等浮点数计算的数据,全部使用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的方向舍入

java保留2位小数及BigDecimal使用的更多相关文章

  1. java使double保留两位小数的多方法 java保留两位小数

    这篇文章主要介绍了java使double类型保留两位小数的方法,大家参考使用吧 复制代码 代码如下: mport java.text.DecimalFormat; DecimalFormat    d ...

  2. java保留两位小数

    java保留两位小数问题: 方式一: 四舍五入  double   f   =   111231.5585;  BigDecimal   b   =   new   BigDecimal(f);  d ...

  3. 转载:java保留2位小数

    转载:http://blog.csdn.net/wj_j2ee/article/details/8560132 java保留两位小数问题: 方式一: 四舍五入  double   f   =   11 ...

  4. java保留两位小数和js保留两位小数一致性研究

    一.java保留两位小数方式 public static void main(String[] args) { System.out.println("=======DecimalForma ...

  5. Java保留两位小数的几种做法

    1.  String类型数字始终保留两位小数 , RoundingMode.HALF_UP); return bd.toString(); } /** * 使用DecimalFormat,保留小数点后 ...

  6. Java 保留两位小数

    在实际项目开发中,经常会存在浮点数四舍五入保留几位小数的问题,故收集了几种常用方法: 直接上代码(保留两位小数). Format.java: import java.math.BigDecimal; ...

  7. (java保留n位小数)precise math function 北京信息科技大学第十届ACM程序设计竞赛 第2题

    precise math function Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Othe ...

  8. java保留n位小数

    double x = 123456789.987654312; String.format("%.nf", x) n为保留的小数位,x必须为double类型. 例如保留3位小数 S ...

  9. java保留两位小数4种方法(转载)

    喵喵最近经常遇到小数点保留的问题,转载一篇Java里面的几种小数点位数控制方法. 这是转载的原地址:https://www.cnblogs.com/chenrenshui/p/6128444.html ...

随机推荐

  1. 解决WDCP3环境gbk网站编码程序乱码问题

    因为默认WDCP V3版本环境编码格式是UTF-8版本,如果我们程序采用的是GBK编码肯定都会有乱码问题. 我们到WDCP后台,"网站管理"-"PHP设置",看 ...

  2. QuickHit 项目

    package cn.javaoppday01; import java.util.Random; public class Game { public Player player; public G ...

  3. 2.18 C++类与static关键字

    参考:http://www.weixueyuan.net/view/6349.html 总结: 类中的成员变量或成员函数一旦与static关键字相结合,则该成员变量或成员函数就是属于类的,而不是再是属 ...

  4. 安装连接mysql8时候遇到的问题以及解决(转)

    官网下载mysql8的安装包: https://dev.mysql.com/downloads/ 下一步安装即可. mysql8增加了传说中的安全性校验 遇到的几个问题: 1.natcat连接不上.参 ...

  5. 201621123001《Java程序设计》第1周学习总结

    1. 本周学习总结 认识java的三个层次:java语法 面向对象设计能力 应用 . 学习eclipse创建java文件的方法. 学习markdown的基本语法,了解写博客的几种常用形式. 了解JVM ...

  6. PropertiesUtil 读取properties

    package com.midea.clean.util; import java.io.InputStream; import java.io.UnsupportedEncodingExceptio ...

  7. Linux文件系统命令 split

    命令:split 功能:将文件按照一定的规则进行切割 用法:-l 表示按照行数进行切割. -b 表示按照字节进行切割,切割后的文件名为自己定义的文件名+aa,ab,ac类似的后缀. eg: 按照行数进 ...

  8. iframe 常见问题 解析

    1. jquery在iframe子页面获取父页面元素代码如下: $("#objid",parent.document) 2. jquery在父页面获取iframe子页面的元素代码如 ...

  9. git 命令篇

    *利用命令在仓库新建文件 *远程克隆到本地 *查看子文件 *创建新的分支  合并分支 删除分支  *合并分支 冲突 当Git无法自动合并分支时,就必须首先解决冲突.解决冲突后,再提交,合并完成. 用g ...

  10. redis 基础应用

          redis 安装  -redis安装 -window的安装 -redis支持5大数据类型 -字符  Memcached 只支持字符串类型 -列表 -字典 -集合 -有序集合  面试题:游戏 ...