前言

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. CSS – 单侧环境 (stylelint, prettier, tailwind)

    前言 真实项目中, 通常搭配 Webpack 之类的工具使用: Webpack 学习笔记 这篇记入的是单元测试的环境 参考: Get started with Tailwind CSS Automat ...

  2. C++ STL list容器——链表

    list容器 简介 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列节点组成,节点可以在运行时动态生成.每个节点包括两部分:一个是存储 ...

  3. USB gadget驱动框架(五)

    本节主要分析虚拟串口的tty设备的注册.创建/dev/ttyGSx设备节点.tty相关接口的实现. tty的申请与注册 源码:drivers/usb/gadget/function/u_serial. ...

  4. 点亮PC13- 使用寄存器点亮

    #include "stm32f10x.h" // Device header int main(void) { // 打卡GPIOC的时钟 RCC->APB2ENR = 0 ...

  5. url 统一资源定位符的组成

    协议 protocol :http 或者 https = http + ssl  或者 file 文件(本地): 域名 host 或 ip 地址: 端口 port 省略默认 80  : 路径 path ...

  6. 分享几个实用且高效的EF Core扩展类库,提高开发效率!

    前言 今天大姚给大家分享3款开源且实用的EF Core扩展类库,希望能帮助你在使用 EF Core 进行数据库开发变得更加高效和灵活,提高开发效率. EF Core介绍 Entity Framewor ...

  7. 我被 .NET8 JIT 的一个BUG反复折磨了半年之久

    很久很久没有写过博客了, 正好最近园子又挣得一线生机, 必须得凑个热闹水一篇. 事情是这样的, 在今年的早些时候, 把公司的一部分api服务器的.net版本从6升级到了8, 毕竟6马上就是EOL了(. ...

  8. Java中重写equals并重写hashcode方法的描述

    1.两个对象的hashCode()相同,equals()不一定为true (1)重写equals()的同时,重写hashCode() a.定义Person类,私有属性name,age:有参构造,set ...

  9. Unreal RecastNavigation 开源项目详解

    0 前言 Recastnavigation是一个游戏AI导航库,像Unity,UE引擎中都集成了这个开源项目, HALO中使用的也是这个开源库.导航最重要的就是为NPC寻路,以及其他的寻路需求. 需要 ...

  10. vue中ref的用法

    用法1. vue给我们提供一个操作dom的属性,ref.绑定在dom元素上时,用起来与id差不多,通过this.$refs来调用: <div ref="test">te ...