Java:使用BigDecimal、NumberFormat和DecimalFormat保留小数

一、代码和调试结果

1.1 BigDecimal

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/fa36749de8124266a730817710fdf737.png)
1.2 DecimalFormat

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3 NumberFormat

在这里插入图片描述

二、原代码

BigDecimalUtil.java 代码

package utils;import java.math.BigDecimal;
import java.math.RoundingMode;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, RoundingMode.HALF_UP);}/*** 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。舍入模式采用用户指定舍入模式** @param v1* @param v2* @param scale*            表示需要精确到小数点以后几位* @param round_mode*            表示用户指定的舍入模式* @return 两个参数的商*/public static double divide(double v1, double v2, int scale, RoundingMode 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, RoundingMode.HALF_UP);}/*** 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。舍入模式采用用户指定舍入模式** @param v1* @param v2* @param scale*            表示需要精确到小数点以后几位* @param round_mode*            表示用户指定的舍入模式* @return 两个参数的商,以字符串格式返回*/public static String divide(String v1, String v2, int scale, RoundingMode 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, RoundingMode.HALF_UP);}/*** 提供精确的小数位四舍五入处理** @param v*            需要四舍五入的数字* @param scale*            小数点后保留几位* @param round_mode*            指定的舍入模式* @return 四舍五入后的结果*/public static double round(double v, int scale, RoundingMode 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, RoundingMode.HALF_UP);}/*** 提供精确的小数位四舍五入处理** @param v*            需要四舍五入的数字* @param scale*            小数点后保留几位* @param round_mode*            指定的舍入模式* @return 四舍五入后的结果,以字符串格式返回*/public static String round(String v, int scale, RoundingMode 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();}
}

TestBigDecimal.java代码

package test;import utils.BigDecimalUtil;
import utils.PrintlnUtils;import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;public class TestBigDecimal {public static void main(String[] args) {test1();test2();}public static void test1() {BigDecimal a = new BigDecimal("10");BigDecimal b = new BigDecimal("5");BigDecimal c = null;/*RoundingMode.HALF_UP5.5     62.5     31.6     21.1     11.0     1-1.0    -1-1.1    -1-1.6    -2-2.5    -3-5.5    -6------------------------------BigDecimal.ROUND_CEILING5.5         62.5         31.6         21.1         21.0         1-1.0        -1-1.1        -1-1.6        -1-2.5        -2-5.5        -5*///1.加法-add
//          c = a.add(b);//c = 15
//        c = a.add(b).setScale(2,BigDecimal.ROUND_HALF_UP) // 过时了c = a.add(b).setScale(2, RoundingMode.HALF_UP);// 2 表示:保留两位小数PrintlnUtils.println("c = " + c);//c = 15.00//2.减法-subtractc = a.subtract(b).setScale(2, RoundingMode.HALF_UP);PrintlnUtils.println("c = " + c);// c = 5.00String substract = BigDecimalUtil.substract("10", "5");PrintlnUtils.println("BigDecimalUtil.substract = " + substract);// BigDecimalUtil.substract = 5String substract2 = BigDecimalUtil.substract("10.00", "5");PrintlnUtils.println("BigDecimalUtil.substract = " + substract2);// BigDecimalUtil.substract = 5.00String substract3 = BigDecimalUtil.substract("10.0", "5");PrintlnUtils.println("BigDecimalUtil.substract = " + substract3);// BigDecimalUtil.substract = 5.0String substract4 = BigDecimalUtil.substract("10.0", "5.00");PrintlnUtils.println("BigDecimalUtil.substract = " + substract4);// BigDecimalUtil.substract = 5.00String substract5 = BigDecimalUtil.substract("10", "5.0");PrintlnUtils.println("BigDecimalUtil.substract = " + substract5);// BigDecimalUtil.substract = 5.0//乘法-multiplyc = a.multiply(b).setScale(2, RoundingMode.HALF_UP);PrintlnUtils.println("c = " + c);// c = 50.00//除法-dividec = a.divide(b).setScale(2, RoundingMode.HALF_UP);PrintlnUtils.println("c = " + c);//c = 2.00c = a.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);PrintlnUtils.println("c = " + c);//c = 0.10//整数舍弃零DecimalFormat df = new DecimalFormat("###.##");String s1 = df.format(new BigDecimal(88.88));String s2 = df.format(new BigDecimal(66.00));String s3 = df.format(new BigDecimal(66.15));String s4 = df.format(new BigDecimal(-66.15));String s5 = df.format(new BigDecimal(666.15));String s6 = df.format(new BigDecimal(666.10));String s7 = df.format(new BigDecimal(666.1));String s8 = df.format(new BigDecimal(666.5));String s9 = df.format(new Double(10666.50));String s92 = df.format(new Double(10666.52));String s93 = df.format(new Double(10666.3));String s94 = df.format(new Double(10666.00));String s95 = df.format(new Double(10666.5));PrintlnUtils.println("s1 = "+s1);//  s1 = 88.88PrintlnUtils.println("s2 = "+s2);//  s2 = 66PrintlnUtils.println("s3 = "+s3);//  s3 = 66.15PrintlnUtils.println("s4 = "+s4);//  s4 = -66.15PrintlnUtils.println("s5 = "+s5);//  s5 = 666.15PrintlnUtils.println("s6 = "+s6);//  s6 = 666.1PrintlnUtils.println("s7 = "+s7);//  s7 = 666.1PrintlnUtils.println("s8 = "+s8);//  s8 = 666.5PrintlnUtils.println("s9 = "+s9);//  s9 = 10666.5PrintlnUtils.println("s92 = "+s92);//  s92 = 10666.52PrintlnUtils.println("s93 = "+s93);//  s93 = 10666.3PrintlnUtils.println("s94 = "+s94);//  s94 = 10666PrintlnUtils.println("s95 = "+s95);//  s95 = 10666.5}public static void test2() {PrintlnUtils.println("test2 ---------------------------------------------------------------------------------------");// BigDecimal// 保留两位小数System.out.println(new BigDecimal(0.2).setScale(2, RoundingMode.HALF_UP).doubleValue());// 0.2System.out.println(new BigDecimal(0.235).setScale(2, RoundingMode.HALF_UP).doubleValue());// 0.23System.out.println(new BigDecimal(0.2351).setScale(2, RoundingMode.HALF_UP).doubleValue());// 0.24System.out.println(new BigDecimal(42).setScale(2, RoundingMode.HALF_UP).doubleValue());// 42.0PrintlnUtils.println(" ---------------------------------------------------------------------------------------");System.out.println(new BigDecimal(0.2).setScale(2, RoundingMode.HALF_UP));// 0.20System.out.println(new BigDecimal(0.235).setScale(2, RoundingMode.HALF_UP));// 0.23System.out.println(new BigDecimal(0.2351).setScale(2, RoundingMode.HALF_UP));// 0.24System.out.println(new BigDecimal(42).setScale(2, RoundingMode.HALF_UP));// 42.00PrintlnUtils.println(" ---------------------------------------------------------------------------------------");// NumberFormat// 保留两位小数,个位无数字填充 0NumberFormat nformat  = NumberFormat.getInstance();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));// 42PrintlnUtils.println(" ---------------------------------------------------------------------------------------");// DecimalFormat,是NumberFormat的具体实现子类// 保留两位小数,对应位上无数字填充0DecimalFormat df = new DecimalFormat("#0.00");df.setRoundingMode(RoundingMode.CEILING);System.out.println(df.format(0.2));// 0.20System.out.println(df.format(0.235));// 0.23System.out.println(df.format(0.2351));// 0.24, 因为0.2351在0.23-0.24之间,距离0.24更近,所以输出0.24System.out.println(df.format(42));// 42.00PrintlnUtils.println(" ---------------------------------------------------------------------------------------");DecimalFormat df4 = new DecimalFormat();// #:位置上无数字不显示df4.applyPattern("#.##");System.out.println(df4.format(345235.0));// 345235System.out.println(df4.format(345235.01245));// 345235System.out.println(df4.format(345235.0156));// 345235System.out.println(df4.format(345235.425));// 345235PrintlnUtils.println(" ---------------------------------------------------------------------------------------");DecimalFormat df42 = new DecimalFormat("0.00");System.out.println(df42.format(345235.0));System.out.println(df42.format(345235.01245));System.out.println(df42.format(345235.0156));System.out.println(df42.format(345235.425));//345235.00//345235.01//345235.02//345235.42PrintlnUtils.println(" ---------------------------------------------------------------------------------------");df42.setRoundingMode(RoundingMode.CEILING);System.out.println(df42.format(345235.0));System.out.println(df42.format(345235.01245));System.out.println(df42.format(345235.0156));System.out.println(df42.format(345235.425));//345235.00//345235.02//345235.02//345235.43PrintlnUtils.println(" ---------------------------------------------------------------------------------------");// 0:位置上无数字显示0df4.applyPattern("0.00");System.out.println(df4.format(345235.0));// 345235.00System.out.println(df4.format(345235));// 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");System.out.println(df4.format(2342.444));// $ 2342.44df4.applyPattern("0.00 QA");System.out.println(df4.format(2342.444));// 2342.44 QA// 使用舍入模式:ROUND_HALF_EVEN,// 保留位数是奇数,使用ROUND_HALF_DOWN// 保留位数是偶数,使用ROUND_HALF_UP
//        df4.setRoundingMode(RoundingMode.HALF_UP);System.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}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/704930.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容联云零代码平台容犀desk:重新定义坐席工作台

在数智化浪潮的推动下&#xff0c;企业亟待灵活适应市场变化、快速响应客户需求&#xff0c;同时还要控制成本并提升效率&#xff0c;传统的软件开发模式因开发周期长、成本高、更新迭代慢等问题&#xff0c;逐渐难以满足企业灵活多变的业务需求。 容犀Desk&#xff0c;观察到…

(保姆级教程傻瓜式操作)树莓派--基于opencv实现人脸识别

前言 因为当时没有边实验边记录&#xff0c;所以这篇文章可能存在疏漏。不过很多地方我推荐了我参考过的博客或者视频&#xff0c;希望尽可能地解答您的疑惑&#xff0c;如果您仍有不懂的地方&#xff0c;欢迎评论&#xff0c;如果我知道答案&#xff0c;我会很乐意为您解答。 …

使用人人开源renren-fast快捷搭建后台管理系统

https://gitee.com/renrenio/renren-fast https://gitee.com/renrenio/renren-fast 初始化项目数据库 导入项目运行 期间遇到的坑 024-04-25 01:30:27.638 ERROR 25228 --- [ main] com.alibaba.druid.pool.DruidDataSource : init datasource error, url: jdbc:…

UIKit之图片浏览器

功能需求 实现一个图片浏览器&#xff0c;点击左右按钮可以切换背景图&#xff0c;且更新背景图对应的索引页和图片描述内容。 分析&#xff1a; 实现一个UIView的子类即可&#xff0c;该子类包含多个按钮。 实现步骤&#xff1a; 使用OC语言&#xff0c;故创建cocoa Touch类…

运用MongoDB Atlas释放开发者潜能同时把控成本

在当下的商业环境中&#xff0c;不可预测性已经成为常态&#xff0c;工程团队负责人必须在把控不可预测性和优化IT成本的双重挑战下谋求平衡。 咨询公司德勤2024 MarginPLUS调查收集了300多位企业负责人的见解&#xff0c;报告中重点介绍了面对动荡的全球经济环境&#xff0c;…

每日5题Day3 - LeetCode 11 - 15

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxArea(int[] height) {//这道题比较特殊&#xff0c;因为两边是任意…

AniPortrait详细讲解以及完整搭建流程(有问题留言)

AniPortrait是一款真实感人像动画的音频驱动合成的AI程序。 下面是它的github源码: GitHub - Zejun-Yang/AniPortrait: AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait AnimationAniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animati…

VC++6.0 ListViewReport报表使用例子

操作步骤&#xff1a; 1&#xff0c;拖一个ListContorl控件 2&#xff0c;修改ID名称 3&#xff0c;设置Report样式 3&#xff0c;加入初始化代码 void CDuplicatefilesclearDlg::InitlizationListView() {CListCtrl *lstVew (CListCtrl*)GetDlgItem(IDC_LIST_Main);lstVew-&…

Shell之高效文本处理命令

目录 一、排序命令—sort 基本语法 常用选项 二、去重命令—uniq 基本语法 常用选项 三、替换命令—tr 基本语法&#xff1a; 常用选项 四、裁剪命令—cut 基本语法&#xff1a; 常用选项 字符串分片 五、拆分命令—split 基本语法&#xff1a; 六、 文件…

kafka用java收发消息

用java客户端代码来对kafka收发消息 具体代码如下 package com.cool.interesting.kafka;import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; i…

Vue 之 后台管理系统的权限路由的管理

目录 前言实现理解三者的概念以及之间的关联账号&#xff08;用户&#xff09;角色菜单 用户权限授权相关概念实现代码实现登录跳转路由&#xff0c;路由守卫中进行权限验证按钮权限封装指令&#xff1a;调用&#xff08;其中一个页面参考&#xff09; 思路&#xff0c;操作流程…

景源畅信数字:做抖音切片的方法分享?

一提起抖音切片&#xff0c;很多人可能会想到那些让人眼前一亮的短视频。它们通常短小精悍&#xff0c;内容丰富多彩&#xff0c;能够迅速吸引观众的注意力。但是&#xff0c;如何制作出这样的切片视频呢?这就是我们今天要探讨的问题。 一、选材与剪辑 制作抖音切片&#xff0…