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
相关产品推荐
相关产品推荐

