202111-23更文-pgsql中float8类型配合java中float类型的奇怪问题解决

这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

pgsql中float类型遇到的奇怪问题

前文

本文为在使用pgsql中,遇到的一个奇怪问题,暂时还没找到具体的原因,选择用其他类型替代来解决。

问题描述

最近遇到了这样的一个问题,当将java中的数据(临近整型数据边界点的数据)存储到pgsql的float8类型字段时,总是出现数据异常的问题。例如存储数据为2147483647,存储的结果会变为2147483648等等。因此导致了数据异常的问题。

问题分析及解决

面对这个问题,首先推测为数据库类型问题或java中字段类型问题导致。于是第一步进行数据库问题的排除。将插入的sql复制出来,直接在数据库中进行执行时,得到正确的结果。这就表明问题在于java项目,而不在于数据库。插入结果如下所示:

image.png 确定了问题原因,进行下一步处理。首先进行第一步,断点调试。在java代码中进行断点,查看接收到的数据。可以看到由于数据与实际数据不匹配,float类型的精度与实际的需求不符合。 image.png 由于好奇心驱使还进行了另一次的测试,也就是输入值使用-214748362,但结果同样令人吃惊:

image.png 可以看到,数据同样被修改。经过测试及资料的查找发现,当float类型的位数大于7位时,会产生数据异常的问题。因此该场景下不适合使用float进行操作。将字段的类型变化为double,得到的断点结果与数据库结果均为正常值,至此该问题解决完毕。

image.png

image.png 由于float类型的精度很容易出现问题,在使用java中该类型时,一定要增加对于边界点的测试工作,防止出现问题的数据异常。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。

猜你喜欢

转载自juejin.im/post/7033596080990191630