mysql float类型 大数值的精确问题

先说结论, 默认的单精度float 类型,如果没有指定超过24的精度(超过24就是double类型了),那么它的数据位数精度是2^24, 它包含小数点后边的整体有效数字不能超过16777216,不管小数点在哪个位置

比如1.2345678 123.45678 1234.5678 1234567.8 都可以精确表达(如果你设置的float(M,D)精确符合你的数字的话, 不然会被截断或者近似的表示)

当数值超过16777216,比如123456789则会出现各种奇怪的现象(尾数会不精确)

===========================================================

从官方文档可以知道, float使用4 byte 来实现,8 * 4 = 32位

根据IEEE754标准, float 会使用科学计数法, 而底数部分 有24位来存储(其中最高位1被隐含了)

https://www.zhihu.com/question/21711083

以下是相关的追踪过程:

最近发现float存在精确性的问题,比如我insert 一个比较大数据值进去

出来的结果和预期会有精确性的差异, 搜了下文档有提到:

对于单精度浮点数Float:  当数据范围在±131072(65536×2)以内的时候,float数据精度是正确的,但是超出这个范围的数据就不稳定,没有发现有相关的参数设置建议:将float改成double或者decimal,两者的差别是double是浮点计算,decimal是定点计算,会得到更精确的数据。

来自 https://www.cnblogs.com/shamo89/p/8202837.html

另外有文档提到,float的整数部分不能超过7位,超过7位后则是不精确的结果,原因暂时未知

不能超过7位数的, 这个说法其实也是基于2^24 = 16777216(8位数)的一个经验性的判断说法而已

https://segmentfault.com/a/1190000016476936

而官方文档并没有特别详细的介绍这一点https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html

发表评论