当前位置: 首页 > ops >正文

金额高精度计算-BigDecimal

Java 中用于精确表示和计算任意精度十进制数的类,在金融、科学计算等对精度要求较高的场景中广泛使用
1. 高精度计算

float 和 double 类型在处理十进制数时,由于采用二进制存储,可能会出现精度丢失问题。而 BigDecimal 可以精确表示和计算十进制数,避免了精度丢失。

public class BigDecimalExample {public static void main(String[] args) {double a = 0.1;double b = 0.2;// 输出结果可能存在精度丢失System.out.println(a + b); BigDecimal bdA = new BigDecimal("0.1");BigDecimal bdB = new BigDecimal("0.2");// 输出结果精确为 0.3System.out.println(bdA.add(bdB)); }
}

2. 不可变性

BigDecimal 对象是不可变的,即一旦创建,其值就不能被修改。每次对 BigDecimal 对象进行运算操作时,都会返回一个新的 BigDecimal 对象。

public class BigDecimalImmutability {public static void main(String[] args) {BigDecimal num1 = new BigDecimal("10");BigDecimal num2 = num1.add(new BigDecimal("5"));// 输出 10,num1 的值并未改变System.out.println(num1); // 输出 15,num2 是新的对象System.out.println(num2); }
}

3. 丰富的运算方法

BigDecimal 提供了丰富的运算方法,如加法(add)、减法(subtract)、乘法(multiply)、除法(divide)等。

public class BigDecimalOperations {public static void main(String[] args) {BigDecimal num1 = new BigDecimal("10");BigDecimal num2 = new BigDecimal("3");// 加法BigDecimal sum = num1.add(num2);// 减法BigDecimal difference = num1.subtract(num2);// 乘法BigDecimal product = num1.multiply(num2);// 除法,需要指定精度和舍入模式BigDecimal quotient = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP);System.out.println("Sum: " + sum);System.out.println("Difference: " + difference);System.out.println("Product: " + product);System.out.println("Quotient: " + quotient);}
}

4. 自定义舍入模式

在进行除法运算或设置小数位数时,BigDecimal 允许用户指定舍入模式,常见的舍入模式有 ROUND_HALF_UP(四舍五入)、ROUND_DOWN(直接截断)等

public class BigDecimalRounding {public static void main(String[] args) {BigDecimal num = new BigDecimal("3.14159");// 四舍五入保留两位小数BigDecimal rounded = num.setScale(2, BigDecimal.ROUND_HALF_UP);System.out.println(rounded); }
}

5. 比较大小

BigDecimal 提供了 compareTo 方法用于比较两个 BigDecimal 对象的大小,该方法返回一个整数,分别表示小于(-1)、等于(0)、大于(1)

public class BigDecimalComparison {public static void main(String[] args) {BigDecimal num1 = new BigDecimal("10");BigDecimal num2 = new BigDecimal("20");int result = num1.compareTo(num2);if (result < 0) {System.out.println("num1 小于 num2");} else if (result == 0) {System.out.println("num1 等于 num2");} else {System.out.println("num1 大于 num2");}}
}

6. 构造方法

BigDecimal 提供了多种构造方法,建议使用 String 类型的构造方法来创建对象,避免使用 double 类型的构造方法,因为 double 类型可能存在精度丢失问题。

public class BigDecimalConstructor {public static void main(String[] args) {// 推荐使用 String 类型的构造方法BigDecimal num1 = new BigDecimal("0.1"); // 不推荐使用 double 类型的构造方法,可能存在精度丢失BigDecimal num2 = new BigDecimal(0.1); System.out.println(num1); System.out.println(num2); }
}
http://www.xdnf.cn/news/9813.html

相关文章:

  • CSformer:结合通道独立性和混合的稳健多变量时间序列预测
  • 【QQ音乐】sign签名| data参数加密 | AES-GCM加密 | webpack (下)
  • 理解教材意图轻松积累常见数列
  • 外贸邮件营销推广怎么做才有效果?
  • 浏览器本地存储
  • 计算机图形学:(六)渲染管线
  • java24
  • 信创改造选择C86,相比于ARM架构有什么优势?
  • HOW - 简历和求职面试宝典(八)
  • 代理模式核心概念
  • 实时操作系统在脑机接口中的技术平衡:满足实时性与 AI 算力需求
  • 深入理解C#泛型:提升代码复用与类型安全的利器
  • STM32CUBE打印浮点数据-cmake配置
  • MySQL、PostgreSQL、Oracle 区别详解
  • 一个超简易的RMAN备份并保留到异地的方案,仅适用于小规模环境
  • 【大模型MCP】MCP 深度解析:AI 时代的「USB-C」接口——原理、对比、实战代码与行业落地
  • 国产三维CAD皇冠CAD(CrownCAD)在专用设备建模教程:液压升降机
  • qlora
  • 电网中三相不平衡治理的全面解析
  • 什么是范式?三大范式分别是什么?
  • JavaScript 中的 BigInt:当普通数字不够“大“时的救星
  • 企业级网络管理实战:Linux、云与容器的深度融合与优化
  • 苹果签名应用掉签频繁原因排查以及如何避免
  • 实测,大模型谁更懂数据可视化?
  • Linux应用开发之网络套接字编程
  • 基于 Arduino Uno R3 的温湿度控制风扇系统开发记录
  • Java ThreadLocal 应用指南:从用户会话到数据库连接的线程安全实践
  • 线程池上下文泄漏:跨线程池的ThreadLocal污染与防御之道
  • 【Unity高级】ScriptableObject 全面解析:从理论到实战
  • 【JSON-to-Video】添加背景图与动效技巧