网站首页 > java教程 正文
介绍
在Java中处理银行相关的精度问题,尤其是货币计算时,浮点型(float/double)的精度缺失会导致严重问题
为什么不能用 double或 float表示金额?
因为double和float无法精确表示十进制小数(如 0.1)
System.out.println(0.1 + 0.2); // 输出 0.30000000000000004
如何精确处理金额精度问题
1、用BigDecimal类
- 支持任意精度的十进制运算。
- 必须用 String 构造器(避免 double 传参的误差):
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal sum = a.add(b); // 精确等于 0.3
// 会传递 double 的不精确值(实际为 0.100000000000000005551...)
BigDecimal a = new BigDecimal(0.1); // 使用 double 构造
除法需指定舍入模式(如 RoundingMode.HALF_UP):
BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP); // 保留两位小数
2、整数表示法
以 最小货币单位(如分)存储金额(long 类型)
- 示例:存储 1.25 元 → 125 分。
- 优点:避免浮点数问题,计算高效。
3、如何解决BigDecimal性能差问题
在高频交易系统中,BigDecimal 性能较差。可以用用 long 表示分,如 1元 = 100分。若需要进行除法运算,可以自己写工具类取模,求余数等进行四舍五入计算。
如何正确比较金额大小
1、正确比较两个 BigDecimal对象
推荐使用compareTo(),仅比较数值
new BigDecimal("2.0").compareTo(new BigDecimal("2.00")) == 0 // true
不推荐equals(),它会严格比较值和精度(scale)
new BigDecimal("2.0").equals(new BigDecimal("2.00")) // false(精度不同)
数据库存储金额方案
1、使用字段类型为DECIMAL(p, s)类型
如 DECIMAL(15, 2),15:总位数(整数+小数),2:小数位数。
猜你喜欢
- 2025-06-24 Java源码解析篇:HashMap(java hashmap 源码)
- 2025-06-24 作为Java开发,知道HashMap底层存储原理总不会害你
- 2025-06-24 四分钟快速入门Java线程的六种状态与流转
- 2025-06-24 程序员常用开发工具合集(含Java、Python等十余种语言)
- 2025-06-24 别再用循环创建字典了!Python推导式让你的代码起飞
- 2025-06-24 Java手写一个bitmap(java手写一个简单翻译的代码)
- 2025-06-24 手把手带你写一个精简版 HashMap 的 put 方法
- 2025-06-24 虚假《我的世界》模组致1500余名玩家中招 密码与钱包数据遭窃
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)