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.2System.out.println(new BigDecimal(0.235).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 0.23System.out.println(new BigDecimal(0.2351).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 0.24System.out.println(new BigDecimal(42).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());// 42.0// NumberFormat// 保留两位小数,个位无数字填充0NumberFormat nformat = NumberFormat.getNumberInstance();nformat.setMaximumFractionDigits(2);System.out.println(nformat.format(0.2));// 0.2System.out.println(nformat.format(0.235));// 0.23System.out.println(nformat.format(0.2351));// 0.24System.out.println(nformat.format(42));// 42// DecimalFormat,是NumberFormat的具体实现子类// 保留两位小数,对应位上无数字填充0DecimalFormat df = new DecimalFormat("#0.00");System.out.println(df.format(0.2));// 0.20System.out.println(df.format(0.235));// 0.23System.out.println(df.format(0.2351));// 0.2, 因为0.2351在0.23-0.24之间,距离0.24更近,所以输出0.24System.out.println(df.format(42));// 42.00DecimalFormat df4 = new DecimalFormat();// #:位置上无数字不显示df4.applyPattern("#.##");System.out.println(df4.format(345235.0));// 345235// 0:位置上无数字显示0df4.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 KGdf4.applyPattern("0.00 QA");System.out.println(df4.format(2342.444));// 2342.44 QA// 使用舍入模式:ROUND_HALF_EVEN,// 保留位数是奇数,使用ROUND_HALF_DOWN// 保留位数是偶数,使用ROUND_HALF_UPSystem.out.println(df4.format(2342.435));// 2342.43 QASystem.out.println(df4.format(2342.445));// 2342.45 QA// String.format// 保留两位小数,个位数及小数点后两位无数字填充0,四舍五入System.out.println(String.format("%.2f", 0.2));// 0.20System.out.println(String.format("%.2f", 0.235));// 0.24System.out.println(String.format("%.2f", 0.236));// 0.24System.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的方向舍入

BigDecimal四舍五入保留两位小数相关推荐

  1. 求以下double数组的平均值(四舍五入保留两位小数):

    import java.math.BigDecimal;/*** 求以下double数组的平均值(四舍五入保留两位小数):* double[] arr = {0.1,0.2,2.1,3.2,5.56, ...

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

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

  3. Double转BigDecimal并保留两位小数出现异常: java.lang.ArithmeticException: Rounding necessary

    分享知识 传递快乐 Double 转 BigDecima l并保留两位小数出现异常: java.lang.ArithmeticException: Rounding necessary . 代码如下: ...

  4. c++ 四舍五入保留两位小数_Excel中保留小数点位数

    今天老板让我把带有小数点的表格进行整理,老板说把数据整理成保留两位,默认为四舍五入,老板还要整理成一种不四舍五入的数据.好的老板马上整理,这次老板的要求正好是我会的,真棒!我们一起来学一下吧. 首先我 ...

  5. JavaScript计算两个文本框内数据的乘积(四舍五入保留两位小数)

    function check(id) { var re = /^[0-9]+.?[0-9]*$/; //判断数字是否合法的正则表达式 var danjia=document.getElementByI ...

  6. 【PAT甲级 ArrayList存放class】1011 World Cup Betting (20 分) Java版 3/3通过 四舍五入保留两位小数

    题目 一共给9个数,3*3,找到每行最大,按照题目要求套算式,计算就行 坑 & 心得 没啥坑,一次通过,用到的知识点是:自定义排序.四舍五入保留两位小数 DecimalFormat df = ...

  7. java float四舍五入保留两位小数_java基础入门-float四舍五入保留两位小数注意的地方...

    float四舍五入保留两位小数注意的地方 最近在codewars做了一道非常简单的题目,但是它却花了我20来分钟,虽然最后解决了,但是中间发觉对于java的基础实在不行,回去要好好补一下 不说这么多, ...

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

    Html 四舍五入保留两位小数: Html: <input type="number" step=".01" id="amount" ...

  9. C#不四舍五入保留两位小数

    /// <summary>/// 不四舍五入保留两位小数/// </summary>/// <param name="money"></p ...

最新文章

  1. zephir开发的扩展“wudimei框架”之数据库使用方法
  2. bzoj4429: [Nwerc2015] Elementary Math小学数学
  3. 红顶商人 —— 胡雪岩
  4. 《统计学》学习笔记之参数估计
  5. 统计字符串中每种字符类型的个数demo
  6. 串口操作之API篇 CreateFile
  7. win10安装pyhive包
  8. latex 插入Python代码
  9. 《CSS世界》--张鑫旭 : 前端样式高手进阶CSS
  10. java实现HTTP的post请求 key-value格式与json格式的区别
  11. “华为跳槽内幕”:有钱没用,你得值钱
  12. 关于JS按钮倒计时禁用的小Demo
  13. python三国演义人物 统计分析_使用python统计《三国演义》小说里人物出现次数前十名,并实现可视化。...
  14. 肿瘤NGS的常规检测流程
  15. ASP.NET Core 导出Excel文件
  16. 华为服务器系列产品介绍,裸金属服务器产品介绍
  17. java中的控制器_SpringMVC基础(一)_控制器
  18. 年轻不学习,老了回村掰苞米!快来学学这份 微服务开发实战派吧
  19. web前端期末大作业 魅力广西我的家乡介绍网页制作(HTML+CSS)
  20. 【求助】 C++如何在堆区创建 string 数组并且访问,o(╥﹏╥)o

热门文章

  1. 【数据库原理与应用MySQL版】实验指导
  2. 产品经理如何推动项目落地
  3. 【身份鉴别-身份标识】Linux系统用户及用户组管理
  4. 仿淘宝购物车demo---增加和减少商品数量
  5. 团队中的“个人英雄主义”
  6. Vulkan简介(1)
  7. Microsoft OLE DB Provider for SQL Server 错误 ‘80004005‘错误原因和解决方案
  8. 小米8探索版线刷兼救砖_解账户锁_纯净刷机包_教程
  9. 精确控制Origin to Word图片格式、大小及主题使用技巧
  10. VMware与宿主机实现共享文件