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.mzph.cn/diannao/13048.shtml

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

相关文章

Linux平台和Windows平台互传文件

rz和sz的出发对象都是从Linux出发的&#xff0c;例如sz发送&#xff08;Send&#xff09;从Linux->发送到Windows。 rz 从Windows文件发送到Linux中 先创立一个新文本文件 之后将hello Windows输入到该文本文件中 在显示器上显示里面是否有hello Windows内容 sz发送Lin…

Retrying,一个神奇优雅的 Python 库

大家好&#xff01;我是爱摸鱼的小鸿&#xff0c;关注我&#xff0c;收看每期的编程干货。 一个简单的库&#xff0c;也许能够开启我们的智慧之门&#xff0c; 一个普通的方法&#xff0c;也许能在危急时刻挽救我们于水深火热&#xff0c; 一个新颖的思维方式&#xff0c;也许能…

非成对意象翻译中的内容制约范式再思考

Rethinking the Paradigm of Content Constraints in Unpaired Image-to-Image Translation 非成对意象翻译中的内容制约范式再思考 Xiuding Cai1 2, Yaoyao Zhu1 2, Dong Miao1 2, Linjie Fu1 2, Yu Yao1 2 蔡秀定 1 2 、朱瑶瑶 1 2 、苗东 1 2 、付林杰 1 2 、余瑶 1 2 Corre…

遥感数据集制作(Potsdam数据集为例):TIF图像转JPG,TIF标签转PNG,图像重叠裁剪

文章目录 TIF图像转JPGTIF标签转PNG图像重叠裁剪图像重命名数据集转COCO格式数据集转VOC格式 遥感图像不同于一般的自然图像&#xff0c;由于波段数量、图像位深度等原因&#xff0c;TIF图像数据不能使用简单的格式转换方法。本文以Potsdam数据集为例&#xff0c;制作能够直接用…

Linux安装配置CGAL,OpenCV和Gurobi记录

安装Qt&#xff0c;查看当前的Qt版本&#xff0c;需要至少满足v5.12 qmake -v安装CGAL&#xff0c;The Computational Geometry Algorithms Library (cgal.org) CGAL v5.6.1&#xff1a;https://github.com/CGAL/cgal/releases/download/v5.6.1/CGAL-5.6.1.tar.xz 确保C编译…

每日复盘-20240515

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 国联证券 (1)|[9:25]|[133765万]|31.12 一…

基于Pytorch深度学习神经网络MNIST手写数字识别系统源码(带界面和手写画板)

第一步&#xff1a;准备数据 mnist开源数据集 第二步&#xff1a;搭建模型 我们这里搭建了一个LeNet5网络 参考代码如下&#xff1a; import torch from torch import nnclass Reshape(nn.Module):def forward(self, x):return x.view(-1, 1, 28, 28)class LeNet5(nn.Modul…

【数据结构】C++语言实现二叉树的介绍及堆的实现(详细解读)

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

分布式系统的一致性与共识算法(三)

顺序一致性(Sequential Consistency) ZooKeeper 一种说法是ZooKeeper是最终一致性&#xff0c;因为由于多副本、以及保证大多数成功的ZAB协议&#xff0c;当一个客户端进程写入一个新值&#xff0c;另外一个客户端进程不能保证马上就能读到这个值&#xff0c;但是能保证最终能…

【车载开发系列】SID$11服务配置

【车载开发系列】SID$11服务配置 前言 ECUReset(ECU重置),ECU作为Server端,执行Client发送来ECU Reset请求中重启的类型(通过子服务区分)。对于UDS协议关于处理该请求的逻辑,没有强制性定义。 Step1:SID和SubFunction的追加 BasicEditor→Dcm→DcmConfigSet→DcmDs…

vs2019 c++里用 typeid() . name () 与 typeid() . raw_name () 测试数据类型的区别

&#xff08;1&#xff09; 都知道&#xff0c;在 vs2019 里用 typeid 打印的类型不大准&#xff0c;会主动去掉一些修饰符&#xff0c; const 和引用 修饰符会被去掉。但也可以给咱们验证学到的代码知识提供一些参考。那么今天发现其还有 raw_name 成员函数&#xff0c;这个函…

AES分组密码

一、AES明文和密钥位数 RIJNDAEL 算法数据块长度和密钥长度都可独立地选定为大于等于 128 位且小于等于 256 位的 32 位的任意倍数。 而美国颁布 AES 时却规定数据块的长度为 128 位、密钥的长度可分别选择为 128 位&#xff0c; 192 位或 256 位 1.1 状态 中间结果叫做状态…

建模:3dmax

3Dmax 制作模型和动画&#xff08;橘肉&#xff09;&#xff1b; RizomUV 对模型进行展UV&#xff08;橘皮&#xff09;&#xff1b; Substance Painter 纹理手绘&#xff08;给橘皮制定想要的皮肤&#xff09;&#xff1b; 1.基础 1.1可编辑多边形、可编辑样条线 体、面都需要…

Polylang Pro插件下载:多语言网站构建的终极解决方案

在全球化的今天&#xff0c;多语言网站已成为企业拓展国际市场的重要工具。然而&#xff0c;创建和管理一个多语言网站并非易事。幸运的是&#xff0c;Polylang Pro插件的出现&#xff0c;为WordPress用户提供了一个强大的多语言解决方案。本文将深入探讨Polylang Pro插件的功能…

暴力数据结构之二叉树(堆的相关知识)

1. 堆的基本了解 堆&#xff08;heap&#xff09;是计算机科学中一种特殊的数据结构&#xff0c;通常被视为一个完全二叉树&#xff0c;并且可以用数组来存储。堆的主要应用是在一组变化频繁&#xff08;增删查改的频率较高&#xff09;的数据集中查找最值。堆分为大根堆和小根…

什么是最大路径?什么是极大路径?

最近学习中&#xff0c;在这两个概念上出现了混淆&#xff0c;导致了一些误解&#xff0c;在此厘清。 最大路径 在一个简单图G中&#xff0c;u、v之间的距离 d ( u , v ) min ⁡ { u 到 v 的最短路的长度 } d(u,v) \min \{ u到v的最短路的长度 \} d(u,v)min{u到v的最短路的…

wefaf

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

每天Get一个小技巧:用DolphinScheduler实现隔几天调度

转载自tuoluzhe8521 这篇小短文将教会你如何使用Apache DolphinScheduler实现隔几天调度&#xff0c;有此需求的小伙伴学起来&#xff01; 1 场景分析 DolphinScheduler定时器模块-定时调度时每3秒|每3分钟|每3天这种定时&#xff0c;不能够跨分钟&#xff0c;跨小时&#x…

【C++】:string类的基本使用

目录 引言一&#xff0c;string类对象的常见构造二&#xff0c;string类对象的容量操作三&#xff0c;string类对象的访问及遍历操作四&#xff0c;string类对象的修改操作五&#xff0c;string类非成员函数六&#xff0c;整形与字符串的转换 引言 string 就是我们常说的"…

如何对SQL Server中的敏感数据进行加密解密?

为什么需要对敏感数据进行加密&#xff1f; 近几年有不少关于个人数据泄露的新闻&#xff08;个人数据通常包含如姓名、地址、身份证号码、财务信息等&#xff09;&#xff0c;给事发公司和被泄露人都带来了不小的影响。 许多国家和地区都出台了个人数据保护的法律法规&#…