You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DECIMAL类型赋值时的舍入机制及自定义方式问询

问题解答

1. 舍入操作的执行主体

这个舍入操作是数据库本身执行的。从你提供的Hibernate日志可知,绑定参数是原始的11.264,但最终数据库保存的是11.26,说明JDBC驱动并未对参数做修改,而是数据库在将值写入DECIMAL(20,2)列时,按照自身默认的四舍五入规则完成了舍入处理。

2. 修改舍入方式的方案

可以通过数据库层面的配置或SQL语句实现直接丢弃多余小数位的需求,无需在Java代码中手动调用bigDecimal.setScale(2, java.math.RoundingMode.DOWN):

  • 数据库配置调整:不同数据库的配置方式不同,例如MySQL可设置会话或全局级别的sql_mode,将ROUND_MODE设为ROUND_FLOOR(对正数而言就是直接截断小数位);PostgreSQL可通过自定义函数或调整相关参数实现类似效果。
  • SQL语句处理:插入或更新时使用数据库自带的截断函数,比如MySQL用TRUNCATE(your_value, 2),PostgreSQL用TRUNC(your_value, 2),让数据库直接保留两位小数、丢弃后续部分,而非四舍五入。
  • Hibernate映射优化:在实体类属性的@Column注解中,通过columnDefinition指定列的处理逻辑,或者自定义Hibernate类型,统一处理数值的截断转换,避免在业务代码中重复处理。

内容的提问来源于stack exchange,提问作者Sergey Zolotarev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:14:53