这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战
pgsql中float类型遇到的奇怪问题
前文
本文为在使用pgsql中,遇到的一个奇怪问题,暂时还没找到具体的原因,选择用其他类型替代来解决。
问题描述
最近遇到了这样的一个问题,当将java中的数据(临近整型数据边界点的数据)存储到pgsql的float8类型字段时,总是出现数据异常的问题。例如存储数据为2147483647,存储的结果会变为2147483648等等。因此导致了数据异常的问题。
问题分析及解决
面对这个问题,首先推测为数据库类型问题或java中字段类型问题导致。于是第一步进行数据库问题的排除。将插入的sql复制出来,直接在数据库中进行执行时,得到正确的结果。这就表明问题在于java项目,而不在于数据库。插入结果如下所示:
确定了问题原因,进行下一步处理。首先进行第一步,断点调试。在java代码中进行断点,查看接收到的数据。可以看到由于数据与实际数据不匹配,float类型的精度与实际的需求不符合。 由于好奇心驱使还进行了另一次的测试,也就是输入值使用-214748362,但结果同样令人吃惊:
可以看到,数据同样被修改。经过测试及资料的查找发现,当float类型的位数大于7位时,会产生数据异常的问题。因此该场景下不适合使用float进行操作。将字段的类型变化为double,得到的断点结果与数据库结果均为正常值,至此该问题解决完毕。
由于float类型的精度很容易出现问题,在使用java中该类型时,一定要增加对于边界点的测试工作,防止出现问题的数据异常。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。