前言

BigDecimal是Java编程语言中位于java.math包中的一个类,主要用于进行高精度的十进制数计算‌。它提供了对任意精度的十进制数进行精确计算的能力,适用于需要保持精度和执行准确计算的场景‌

BigDecimal使用基于整数的表示方法,通过存储和处理数值的每一位来避免精度丢失。这使得它可以表示极大或极小的数字,并执行准确的计算。与基本的浮点数类型(如float和double)不同,BigDecimal通过调用相应的方法来进行数学运算,而不是使用传统的+、-、*、/等算术运算符‌。

BigDecimal广泛应用于金融领域、货币计算、税务计算、精确计算需求以及其他需要保持精度和执行准确计算的场景。由于BigDecimal对象是不可变的,每个操作都会产生一个新的BigDecimal对象作为结果,这在某些情况下可能会影响性能。

1.BigDecimal数值运算

        BigDecimal a = new BigDecimal("10.123");
BigDecimal b = new BigDecimal("2.123");
// 加法
BigDecimal addResult = a.add(b);
System.out.println("加法结果: " + addResult);
// 减法
BigDecimal subtractResult = a.subtract(b);
System.out.println("减法结果: " + subtractResult);
// 乘法
BigDecimal multiplyResult = a.multiply(b);
System.out.println("乘法结果: " + multiplyResult);
// 除法,并设置舍入模式为四舍五入
BigDecimal divideResult = a.divide(b, 2, RoundingMode.HALF_UP);
System.out.println("除法结果: " + divideResult);

2.bigDecimal数据转换

        // 1.int转BigDecimal
int intValue = 10;
BigDecimal intToBigDecimal = new BigDecimal(intValue);
System.out.println("int转BigDecimal: " + intToBigDecimal); // 2.double转BigDecimal
double doubleValue = 10.123;
BigDecimal doubleToBigDecimal = new BigDecimal(doubleValue);
System.out.println("double转BigDecimal: " + doubleToBigDecimal); // 3.String转BigDecimal
String stringValue = "10.123";
BigDecimal stringToBigDecimal = new BigDecimal(stringValue);
System.out.println("String转BigDecimal: " + stringToBigDecimal); // long转BigDecimal
long longValue = 10L;
BigDecimal longToBigDecimal = new BigDecimal(longValue);
System.out.println("long转BigDecimal: " + longToBigDecimal);

3.bigDecimal精度处理

        // 小数点的处理
BigDecimal decimal = new BigDecimal("10.123456789");
System.out.println("原始数据: " + decimal);
// 截取小数点后两位
BigDecimal decimal2 = decimal.setScale(2, RoundingMode.HALF_UP);
System.out.println("截取小数点后两位: " + decimal2);
// 截取小数点后四位
BigDecimal decimal4 = decimal.setScale(4, RoundingMode.HALF_UP);
System.out.println("截取小数点后四位: " + decimal4);
// 截取小数点后六位 (超过6位的小数点将被舍弃)
BigDecimal decimal6 = decimal.setScale(6, RoundingMode.HALF_UP);
System.out.println("截取小数点后六位: " + decimal6);
// 截取小数点后八位 (超过8位的小数点将被舍弃)
BigDecimal decimal8 = decimal.setScale(8, RoundingMode.HALF_UP);
System.out.println("截取小数点后八位: " + decimal8);
// 直接删除多余的小数位
BigDecimal test = new BigDecimal("9.56666");
//直接删除多余的小数位
System.out.println("删除多余的小数位: " + test.setScale(2, BigDecimal.ROUND_DOWN));
// 四舍五入
BigDecimal test2 = new BigDecimal("9.56666");
//四舍五入
System.out.println("四舍五入: " + test2.setScale(2, BigDecimal.ROUND_HALF_UP)); double i = 3.856;
// 舍掉小数取整
System.out.println("舍掉小数取整:Math.floor(3.856)=" + (int) Math.floor(i)); // 四舍五入取整
System.out.println("四舍五入取整:(3.856)=" + new BigDecimal(i).setScale(0, BigDecimal.ROUND_HALF_UP)); // 四舍五入保留两位小数
System.out.println("四舍五入取整:(3.856)=" + new BigDecimal(i).setScale(2, BigDecimal.ROUND_HALF_UP)); // 凑整,取上限
System.out.println("凑整:Math.ceil(3.856)=" + (int) Math.ceil(i)); // 舍掉小数取整
System.out.println("舍掉小数取整:Math.floor(-3.856)=" + (int) Math.floor(-i));
// 四舍五入取整
System.out.println("四舍五入取整:(-3.856)=" + new BigDecimal(-i).setScale(0, BigDecimal.ROUND_HALF_UP)); // 四舍五入保留两位小数
System.out.println("四舍五入取整:(-3.856)=" + new BigDecimal(-i).setScale(2, BigDecimal.ROUND_HALF_UP)); // 凑整,取上限
System.out.println("凑整(-3.856)=" + (int) Math.ceil(-i));

4.bigDecimal的比较

        BigDecimal a1 = new BigDecimal("10.123");
BigDecimal b1 = new BigDecimal("2.123");
// 等于
System.out.println(a1.compareTo(b1) == 0);
// 大于
System.out.println(a1.compareTo(b1) > 0);
// 小于
System.out.println(a1.compareTo(b1) < 0);
// 大于等于
System.out.println(a1.compareTo(b1) >= 0);
// 小于等于
System.out.println(a1.compareTo(b1) <= 0);

5.bigDecimal的其他常用方法和函数

        BigDecimal a2 = new BigDecimal("10.123");
BigDecimal b2 = new BigDecimal("2.123");
// 绝对值
System.out.println("绝对值: " + a2.abs());
// 向上取整
System.out.println("向上取整: " + Math.ceil(a2.doubleValue()));
// 向下取整
System.out.println("向下取整: " + Math.floor(a2.doubleValue()));
// 四舍五入
System.out.println("四舍五入: " + a2.setScale(2, BigDecimal.ROUND_HALF_UP));
// 取整
System.out.println("取整: " + a2.setScale(0, BigDecimal.ROUND_HALF_UP));
// 取余
System.out.println("取余: " + a2.remainder(b2));
// 最大值
System.out.println("最大值: " + a2.max(b2));
// 最小值
System.out.println("最小值: " + a2.min(b2));
// 平方根
System.out.println("平方根: " + Math.sqrt(a2.doubleValue()));
// 正弦
System.out.println("正弦: " + Math.sin(a2.doubleValue()));
// 余弦
System.out.println("余弦: " + Math.cos(a2.doubleValue()));
// 正切
System.out.println("正切: " + Math.tan(a2.doubleValue()));
// 自然对数
System.out.println("自然对数: " + Math.log(a2.doubleValue()));
// 常用函数
System.out.println("常用函数: " + Math.exp(a2.doubleValue()));
// 百分数
System.out.println("百分数: " + a2.movePointLeft(2));
// 科学计数法
System.out.println("科学计数法: " + a2.toEngineeringString());
// 格式化输出
System.out.printf("格式化输出: " + "%.2f", a2.doubleValue());

6.bigdecimal精度丢失问题

        // BigDecimal类用于精确的十进制数值计算。当使用BigDecimal进行运算时,
// 如果不正确处理精度模式(如ROUND_HALF_UP),可能会导致精度失去控制,即数值并非预期的结果。
//解决方法:
//1.在进行加减乘除等运算时,确保正确设置BigDecimal的精度和舍入模式。
//2.如果需要对BigDecimal对象进行多次运算,可以使用BigDecimal的setScale方法设置统一的精度和舍入模式。
//3.在创建BigDecimal对象时,如果使用基本类型double作为参数,应该使用BigDecimal的valueOf方法,而不是new BigDecimal(double),因为后者可能会导致精度问题。
BigDecimal bigDecimal1 = new BigDecimal("1.234");
BigDecimal bigDecimal2 = new BigDecimal("5.678");
// 正确设置舍入模式和精度:结果保留3位小数,并进行四舍五入
BigDecimal result = bigDecimal1.add(bigDecimal2).setScale(3, RoundingMode.HALF_UP);
System.out.println("结果: " + result); // bigdecimal精度格式化问题:
// BigDecimal类提供了toPlainString方法,可以将BigDecimal对象转换为字符串,
// 但是该方法并不提供精度控制,如果需要精度控制,可以使用BigDecimal的toString方法。
// 另外,BigDecimal类提供了format方法,可以格式化BigDecimal对象,
// 该方法可以指定输出的格式,包括整数位数、小数位数、是否显示符号、是否使用科学计数法等。
DecimalFormat df = new DecimalFormat("#,###.#################");
DecimalFormat df01 = new DecimalFormat("#0.00");
BigDecimal bigDecimal3 = new BigDecimal("1234567890.1234567890");
// 格式化输出: 1234567890.1234567890
System.out.println("格式化输出: " + bigDecimal3.toPlainString());
// 格式化输出: 123,456,789,0.1234567890
System.out.println("格式化输出: " + df.format(bigDecimal3.doubleValue()));
System.out.println("格式化输出: " + df01.format(bigDecimal3.doubleValue()));

BigDecimal数据处理方法总结的更多相关文章

  1. BigDecimal 使用方法详解

    BigDecimal 使用方法详解 博客分类: java基础 bigdecimalmultiplyadddivide  BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (sca ...

  2. 解决java.math.BigDecimal divide方法运算结果为无限小数问题

    http://samueli.iteye.com/blog/224755 BigDecimal除法运算报错,错误如下:Non-terminating decimal expansion; no exa ...

  3. 【java】Java.math.BigDecimal.subtract()方法实例

    java.math.BigDecimal.subtract(BigDecimal subtrahend) 返回一个BigDecimal,其值为 (this - subtrahend), 精度为 max ...

  4. Java.math.BigDecimal.abs()方法

    java.math.BigDecimal.abs()返回一个BigDecimal,其值是此BigDecimal的绝对值,其标度是this.scale(). 声明 以下是java.math.BigDec ...

  5. BigDecimal.divide方法

    java.math.BigDecimal.divide(BigDecimal divisor, int roundingMode) 返回一个BigDecimal,其值为(this/除数),其标度是th ...

  6. java取整和java四舍五入方法 BigDecimal.setScale()方法详解

    import java.math.BigDecimal; public class TestGetInt { public static void main(String[] args) { doub ...

  7. JMeter在里面Json数据处理方法

    http://eclipsesource.com/blogs/2014/06/12/parsing-json-responses-with-jmeter/ Json作为一种数据交换格式在网络开发.特别 ...

  8. 新手数据比赛中数据处理方法小结(python)

    第一次参加,天池大数据竞赛(血糖预测),初赛排名1%.因为自己对python不熟悉,所以记录一下在比赛中用到的一些python方法的使用(比较基础细节,大佬绕道): 1.数据初探 data.info( ...

  9. javascript 大数据处理方法

    随着前端的飞速发展,在浏览器端完成复杂的计算,支配并处理大量数据已经屡见不鲜.那么,如何在最小化内存消耗的前提下,高效优雅地完成复杂场景的处理,越来越考验开发者功力,也直接决定了程序的性能. 本文展现 ...

  10. 避免MySQL出现重复数据处理方法

    对于常规的MySQL数据表中可能存在重复的数据,有些情况是允许重复数据的存在,有些情况是不允许的,这个时候我们就需要查找并删除这些重复数据,以下是具体的处理方法! 方法一:防止表中出现重复数据 当表中 ...

随机推荐

  1. [rCore学习笔记 026]第三章作业

    写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 编程题 ...

  2. 应聘软件测试 HR 会问到哪些问题?收藏这一篇就够了!

    1.你还有收到其他offer吗? 其实hr问你offer情况,是对你感兴趣,想要进一步了解你,看下你的市场竞争力. 但注意不要太坦诚的说:我还没有offer或者收到两个offer还想对比对比:也不要撒 ...

  3. 大模型应用开发初探 : 通用函数调用Planner

    大家好,我是Edison. 上一篇,我们了解了什么是AI Agent以及如何用Semantic Kernel手搓一个AI Agent.有朋友留言说,自动函数调用对大模型有较高的要求,比如Azure O ...

  4. docker基础镜像java版本选择和推荐

    背景 在编写dockerfile时,基础镜像要么太大,要么缺少jdk:dockerhub中的openjdk五花八门,不知道选择哪个 解决方案 我在项目中通常选择 openjdk作为基础镜像 FROM ...

  5. 音视频入门-4-ffmpeg命令快速体验音视频开发/ ffmpeg编译过程经历的99八十一难

    <1>我的实验所使用的视频文件告知读者 1. 这是我在ubuntu环境上实验使用的视频文件, 我在windows上查看了详细信息,然后拖进ubuntu内,重命名为video-test.mp ...

  6. HEOI2024 题目转存

    赛时测试数据下载 wind xor wormhole maze timeline sleep 题解参考 [省选联考 2024] 季风 题目背景 生活在二维平面的小 X 准备拜访小 Y,但由于气候的变化 ...

  7. 【赵渝强老师】阿里云大数据ACP认证之阿里大数据产品体系

    阿里大数据产品体系是基于阿里云飞天平台上的数据处理服务.主要分为阿里云大数据基础产品和阿里云数加平台,其产品架构图如下所示: 一.阿里云大数据基础产品 1.云数据库--RDS(ApsaraDB for ...

  8. 解密prompt系列39. RAG之借助LLM优化精排环节

    RAG的部分我们之前讨论过信息召回的多样性,信息密度和质量,主要集中在召回,融合,粗排的部分.这一章我们集中看下精排的部分.粗排和精排的主要差异其实在于效率和效果的balance.粗排模型复杂度更低, ...

  9. excel江湖异闻录--◆K

    网名◆K,按照群里同学的说法,K神和老大kluas,以及一个名为KKK的VBA强人,都是K字头家族的高手. 因为函数实力极强,时常碾压难题,被群里同学们冠以了"K神"的称号. 用笔 ...

  10. Android MTP流程

    概要 本文的目的是介绍Android系统中MTP的一些相关知识.主要的内容包括:第1部分 MTP简介 对Mtp协议进行简单的介绍.第2部分 MTP框架 介绍Android系统下MTP的框架.第3部分 ...