今天在盘点的时候折腾了一次,在创建表的时候么有关注到浮点数的精度问题,导致排查问题浪费了很长时间.
场景:汇总报表,将查出的数据插入另外一张表中,查出来的数据是小数,转成另一张表对应的javabean也是小数,但是在插入数据库之后就成了整数了,说明小数被抹去了,我以为是框架的问题,就问负责框架的人,结果他的测试是按照保留小数点0位来测的,结果跟我同一个效果,经过dba的指点,应该是数据库表浮点字段没有指定精度导致的。
下面就简要说明一下原理。
首先看下面四条创建表的语句:
Sql1:
CREATE TABLE `t_rep_inventory` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`initialnum` decimal(20,2) DEFAULT NULL COMMENT '期初库存数量',
`endingnum` decimal(20,2) DEFAULT NULL COMMENT '期末库存数量',
`rechecknum` decimal(20,2) DEFAULT NULL COMMENT '盘点数量',
`diffnum` decimal(20,2) DEFAULT NULL COMMENT '盘盈/盘亏数量',
`diffreason` int(11) DEFAULT NULL COMMENT '盘盈/盘亏原因',
`iccode` varchar(40) DEFAULT NULL COMMENT '盘点单号',
`starttime` timestamp NULL DEFAULT NULL COMMENT '报表生成开始时间',
`endtime` timestamp NULL DEFAULT NULL COMMENT '报表生成截止时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=298151 DEFAULT CHARSET=utf8mb4;
Sql2:
CREATE TABLE `t_rep_inventory` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`initialnum` decimal(20,0) DEFAULT NULL COMMENT '期初库存数量',
`endingnum` decimal(20,0) DEFAULT NULL COMMENT '期末库存数量',
`rechecknum` decimal(20,0) DEFAULT NULL COMMENT '盘点数量',
`diffnum` decimal(20,0) DEFAULT NULL COMMENT '盘盈/盘亏数量',
`diffreason` int(11) DEFAULT NULL COMMENT '盘盈/盘亏原因',
`iccode` varchar(40) DEFAULT NULL COMMENT '盘点单号',
`starttime` timestamp NULL DEFAULT NULL COMMENT '报表生成开始时间',
`endtime` timestamp NULL DEFAULT NULL COMMENT '报表生成截止时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=298151 DEFAULT CHARSET=utf8mb4;
Sql3:
CREATE TABLE `t_rep_inventory` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`initialnum` double(20,0) DEFAULT NULL COMMENT '期初库存数量',
`endingnum` double (20,0) DEFAULT NULL COMMENT '期末库存数量',
`rechecknum` double (20,0) DEFAULT NULL COMMENT '盘点数量',
`diffnum` double (20,0) DEFAULT NULL COMMENT '盘盈/盘亏数量',
`diffreason` int(11) DEFAULT NULL COMMENT '盘盈/盘亏原因',
`iccode` varchar(40) DEFAULT NULL COMMENT '盘点单号',
`starttime` timestamp NULL DEFAULT NULL COMMENT '报表生成开始时间',
`endtime` timestamp NULL DEFAULT NULL COMMENT '报表生成截止时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=298151 DEFAULT CHARSET=utf8mb4;
Sql4:
CREATE TABLE `t_rep_inventory` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`initialnum` double(20,0) DEFAULT NULL COMMENT '期初库存数量',
`endingnum` double (20,0) DEFAULT NULL COMMENT '期末库存数量',
`rechecknum` double (20,0) DEFAULT NULL COMMENT '盘点数量',
`diffnum` double (20,0) DEFAULT NULL COMMENT '盘盈/盘亏数量',
`diffreason` int(11) DEFAULT NULL COMMENT '盘盈/盘亏原因',
`iccode` varchar(40) DEFAULT NULL COMMENT '盘点单号',
`starttime` timestamp NULL DEFAULT NULL COMMENT '报表生成开始时间',
`endtime` timestamp NULL DEFAULT NULL COMMENT '报表生成截止时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=298151 DEFAULT CHARSET=utf8mb4;
能看到区别吗?
总结:在使用浮点型数据类型进行业务处理的时候一定要注意bean的类型与数据库类型一致,并且保留精度要明确。当初建立表的时候没有设置,默认为0导致出现问题。