NutzCN Logo
问答 如何用ColDefine控制数据库精度
发布于 2698天前 作者 老司机 1682 次浏览 复制 上一个帖子 下一个帖子
标签:

entity

@Table("t_dog")
public class Dog {
    @Column
    @ColDefine(type = ColType.FLOAT)
    private BigDecimal price;

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }
}

ColDefine,默认精度precision是2,但是实际插入时

 public static void main(String[] arg) {
        SimpleDataSource dataSource = new SimpleDataSource();
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        DaoUp.me().setDataSource(dataSource);
        Dao dao = DaoUp.me().dao();
        Daos.createTablesInPackage(dao, Dog.class, true);
        Dog dog = new Dog();
        dog.setPrice(new BigDecimal(3.1415926));
        dao.insert(dog);
    }

结果数据库显示该字段的值为3.14159,既不是2,也不是我输入的精度,请问为啥?

12 回复

更奇怪的是sql打出来是

17-08-03 14:52:07.946 DEBUG [main] INSERT INTO t_dog(price) VALUES(?) 
    |                                                    1 |
    |------------------------------------------------------|
    | 3.14159260000000006840537025709636509418487548828125 |
  For example:> "INSERT INTO t_dog(price) VALUES('3.14159260000000006840537025709636509418487548828125') "

ColDefine的精度只控制建表语句, jdbc插入浮点型没有精度一说

要想完全还原插入的值, 字符串咯

@wendal 但建表语句也没有控制啊

17-08-03 14:52:07.597 DEBUG [main] DROP TABLE t_dog
17-08-03 14:52:07.709 DEBUG [main] CREATE TABLE t_dog(
price FLOAT) ENGINE=InnoDB CHARSET=utf8

没有控制精度

mysql就是这样

@wendal 只改变entity字段类型,不改变注解,字段类型还不一样?
原本是BigDecimal,现在改为double后

17-08-03 15:40:55.378 DEBUG [main] DROP TABLE t_dog
17-08-03 15:40:55.566 DEBUG [main] CREATE TABLE t_dog(
price NUMERIC(15,10)) ENGINE=InnoDB CHARSET=utf8

@wendal mysql不是有DECIMAL(15,2)这样的字段类型吗?为啥注解里精度没用呢?

BigDecimal应该用字符串

@wendal 数据库字段用字符串,那么sum还可以计算吗?

@wendal 可以是可以,但是想问下大神,根据您的经验,在定义entity的时候,价格字段,这种需要保留两位小数,而且要精确计算的,是用double还是Double,或者是BigDecimal,亦或是其他别的字段类型?

就为了存多少钱? 你应该改成 以分为单位, 而不是用"元"

@wendal 用分?然后在前后端交互的时候乘除100?还有这种操作?

添加回复
请先登陆
回到顶部