快速体验
- 打开 InsCode(快马)平台 https://www.inscode.net
- 输入框内输入如下内容:
创建一个面向Java初学者的教学代码示例,展示:1. 为什么double类型不适合金额计算;2. BigDecimal基本用法;3. 保留两位小数的三种方法(ROUND_HALF_UP等);4. 常见错误示例。要求代码有详细注释,每个示例都有控制台输出对比。使用最简单的Kimi-K2模型生成。 - 点击'项目生成'按钮,等待项目生成完整后预览效果

为什么不用double算钱?
刚学Java时,很多人会用double类型来处理金额计算。直到某天发现:
- 商品单价0.1元,买3件时
System.out.println(0.1 * 3)居然输出0.30000000000000004 - 超市收银系统如果用double,可能多收顾客1分钱
这是因为double采用二进制浮点数运算,存在精度丢失问题。就像用1/3≈0.333...永远算不准一样。
BigDecimal的正确打开方式
Java提供了BigDecimal类专门处理精确计算,它的核心特点是:
- 通过字符串构造避免初始精度丢失
- 所有运算方法(加减乘除)都明确要求指定舍入模式
- 可精确控制小数位数
比如创建表示10元的金额:
// 错误示范:仍有精度风险
BigDecimal d1 = new BigDecimal(0.1);
// 正确做法:用字符串初始化
BigDecimal price = new BigDecimal("10.00");
保留两位小数的三种姿势
假设我们要把π=3.1415926格式化为3.14:
-
四舍五入(最常用)
BigDecimal pi = new BigDecimal("3.1415926"); pi = pi.setScale(2, RoundingMode.HALF_UP); System.out.println(pi); // 输出3.14 -
直接截断(不推荐用于金额)
pi.setScale(2, RoundingMode.DOWN); // 输出3.14 // 但3.149会变成3.14而非3.15 -
银行家舍入法(统计场景用)
pi.setScale(2, RoundingMode.HALF_EVEN); // 1.15→1.2(奇数进位) 1.25→1.2(偶数舍去)
新手避坑指南
见过这些翻车现场吗?
-
陷阱1:用double构造BigDecimal
new BigDecimal(0.1); // 实际值≈0.10000000000000000555 -
陷阱2:忘记指定舍入模式
BigDecimal a = new BigDecimal("1.00"); a.divide(new BigDecimal("3")); // 抛ArithmeticException -
陷阱3:误用equals比较
new BigDecimal("1.0").equals(new BigDecimal("1.00")) // false! // 应该用compareTo()
来试试看吧
在InsCode(快马)平台的Java模板里,我已经准备好了可运行的示例代码。点击"运行"就能看到不同舍入模式的对比效果,还能修改数值自己测试。

这个平台特别适合新手练习——不用配环境,写完直接看结果。我经常用它做小实验,比如测试边界值会不会溢出,比本地开IDE快多了。
快速体验
- 打开 InsCode(快马)平台 https://www.inscode.net
- 输入框内输入如下内容:
创建一个面向Java初学者的教学代码示例,展示:1. 为什么double类型不适合金额计算;2. BigDecimal基本用法;3. 保留两位小数的三种方法(ROUND_HALF_UP等);4. 常见错误示例。要求代码有详细注释,每个示例都有控制台输出对比。使用最简单的Kimi-K2模型生成。 - 点击'项目生成'按钮,等待项目生成完整后预览效果
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
6990

被折叠的 条评论
为什么被折叠?



