当前位置:  开发笔记 > 编程语言 > 正文

休眠和货币精确度

如何解决《休眠和货币精确度》经验,为你挑选了2个好方法。

我有一个hibernate映射如下:


    
        
            
        
        
        
        
        
        
        
    
    

其中InvoiceTVO的变量定义为:

private int id;
private Date date;
private int customerId;
private int schoolId;
private float bookFee;
private float adminFee;
private float totalFee;

当我在此表上插入时,出现以下错误:

Hibernate: insert into INVOICE (INVOICE_DATE, CUSTOMER_ID, SCHOOL_ID, BOOK_FEE, ADMIN_FEE, TOTAL_FEE, ID) values (?, ?, ?, ?, ?, ?, ?)
50156 [AWT-EventQueue-0] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 0, SQLState: 22001
50156 [AWT-EventQueue-0] ERROR org.hibernate.util.JDBCExceptionReporter - Data truncation: Data truncated for column 'ADMIN_FEE' at row 1
50156 [AWT-EventQueue-0] ERROR org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session

我尝试将adminFee的类型更改为double,但这也不起作用.问题是,Hibernate确实正确地执行了插入操作,并且将来的select语句可以返回当前的值集,但是这个错误阻止我对此发票进行进一步处理.

字段bookFee,adminFee和totalFee都应该是货币.它们在MySQL数据库中定义为十进制(5,2).

如何解决这个问题的任何帮助将不胜感激.



1> Michael Borg..:

使用浮动或双倍的钱是绝对不可接受的,甚至可能是非法的(如违反法律或至少是法规).这需要修复,然后错误将消失.float的精度有限,根本无法准确表示大多数小数.

为了钱,总是,总是使用BigDecimal.



2> Phil..:

我会使用整数类型(int,long).永远不会有任何有趣的问题,你可以避免溢出.


不幸的是,美国财政部正在增加长期溢出的风险.
实际上,他们更有可能长期下流.
推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有