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

Java 中 BigDecimal、Float、Double 的取整与保留小数处理方法详解

在日常的企业级 Java 开发中,浮点数的精度控制与舍入处理常常是财务系统、计量系统、SaaS 计费系统等场景中的核心需求。本文将围绕 BigDecimalFloatDouble 三种常用数值类型,系统性地讲解如何在 Java 中进行“取整处理”以及“保留指定位数的小数”。


一、基础类型概览

类型精度特性适用场景
float约 7 位十进制有效位图形渲染、传感器数据
double约 15 位十进制有效位科学计算、非财务场景中的近似计算
BigDecimal任意精度(定点表示)财务系统、计价、利率、账单

提示floatdouble 属于二进制浮点表示,不能精确表示所有十进制小数,如 0.1 + 0.2 ≠ 0.3BigDecimal 为定点小数,适合需要精确计算的业务场景。


二、取整处理方式(去小数部分)

1. BigDecimal 去整数或保留整数部分

方法一:去掉小数部分,保留整数(向下取整)
BigDecimal value = new BigDecimal("123.4567");
BigDecimal integerPart = value.setScale(0, RoundingMode.DOWN);
System.out.println(integerPart); // 输出 123
方法二:只保留小数部分
BigDecimal decimalPart = value.remainder(BigDecimal.ONE);
System.out.println(decimalPart); // 输出 0.4567

⚠️ 若值为负数,小数部分也为负。可通过 .abs() 获取正的小数部分。


2. Float / Double 去整数(保留整数部分)

double d = 123.4567;
int intPart = (int) d; // 强制转换,直接截断
System.out.println(intPart); // 输出 123

⚠️ 使用 (int) 会舍弃小数部分(向零靠拢),不推荐用于财务计算。


三、保留指定位数的小数

1. BigDecimal 保留两位小数

方式一:使用 setScale
BigDecimal value = new BigDecimal("123.4567");
BigDecimal rounded = value.setScale(2, RoundingMode.HALF_UP);
System.out.println(rounded); // 输出 123.46(四舍五入)
RoundingMode含义
HALF_UP四舍五入(常用)
DOWN直接截断(不进位)
CEILING向上取整(正方向)
FLOOR向下取整(负方向)

2. Float / Double 保留两位小数(⚠️ 仅显示用途)

double d = 123.4567;
String formatted = String.format("%.2f", d);
System.out.println(formatted); // 输出 123.46

📌 本质上没有改变 d 的值,仅用于显示。如果需要数值级的保留精度,请转为 BigDecimal 操作。


3. 将 Double 转为 BigDecimal 后精确控制

double d = 123.4567;
BigDecimal bd = new BigDecimal(Double.toString(d));
BigDecimal rounded = bd.setScale(2, RoundingMode.HALF_UP);
System.out.println(rounded); // 输出 123.46

⚠️ 使用 new BigDecimal(double) 存在二进制浮点误差,应优先使用 BigDecimal.valueOf(double)new BigDecimal(String)


四、实践建议

场景推荐类型原因
财务计算、税率、利息BigDecimal支持任意精度,避免精度丢失
需要高性能、允许误差的小数double性能优先,计算快
保留两位用于展示String.format格式化展示友好

五、通用工具方法示例

public class DecimalUtils {public static BigDecimal keepScale(BigDecimal value, int scale) {return value.setScale(scale, RoundingMode.HALF_UP);}public static BigDecimal getDecimalPart(BigDecimal value) {return value.remainder(BigDecimal.ONE);}public static BigDecimal getIntegerPart(BigDecimal value) {return value.setScale(0, RoundingMode.DOWN);}public static String formatDouble(double val, int scale) {return String.format("%." + scale + "f", val);}
}

六、总结

  • BigDecimal 是进行取整、保留小数等操作的首选,适用于精度要求极高的系统;

  • floatdouble 更适用于对性能有要求但容忍精度误差的场景;

  • 所有涉及货币、计价的系统中,应避免使用 float 和 double 存储金额

  • 所有保留小数位的操作,请优先使用 BigDecimal.setScale 实现,而非 Math.round()String.format()

http://www.xdnf.cn/news/17194.html

相关文章:

  • 简要探讨大型语言模型(LLMs)的发展历史
  • Android进程基础:Zygote
  • Linux 磁盘管理与分区配置
  • 【2025WACV-最佳论文】RayGauss:基于体积高斯的光线投射,用于逼真的小说视图合成
  • (JAVA)自建应用调用企业微信API接口,设置企业可信IP
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第五天(jQuery函数库)
  • 使用1panel将http升级至https的过程
  • 板子指示灯状态设计
  • ESDocValues机制
  • Easysearch 集成阿里云与 Ollama Embedding API,构建端到端的语义搜索系统
  • python与C++
  • web第一次作业
  • Spring Cloud Gateway 实现登录校验:构建统一认证入口
  • Kali基础知识点【2】
  • Linux 网络深度剖析:传输层协议 UDP/TCP 原理详解
  • 小实验:按键点灯(中断法)
  • 如何安装 nvm-setup.exe?Windows 安装 NVM 管理 Node.js 版本的完整流程(附安装包下载)
  • C# 类型
  • Git基础操作教程
  • Dbeaver数据库的安装和使用(保姆级别)
  • 计算机网络:理解路由的下一跳
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现路口车辆速度的追踪识别(C#代码UI界面版)
  • 【保姆级 - 大模型应用开发】DeepSeek + Faiss + langchain 搭建本地知识库 检索 | 代码实战
  • 行业报告:.games域名正引领游戏娱乐产业营销新风向
  • Ubuntu 下 MySQL 运维自动化部署教程(在线简易版)
  • 【测试】⾃动化测试常⽤函数
  • Linux命令top
  • Selenium教程(Python 网页自动化测试脚本)
  • 清洁机器人从“看到垃圾”到“预判污染”:技术如何演变?
  • Ubuntu24.04的VSCode中安装MoonBit和MoonBit Toolchain(moon-pilot)