float精确问题

字段类型为float(8,2)不知道为什么131072.32近似值为131072.31

根据您提供的信息,字段类型为 float(8,2),表示该字段是一个浮点数,总共占据 8 个字节的存储空间,并且保留两位小数。

在浮点数的存储和计算中,由于浮点数的二进制表示方式的限制,可能会导致精度损失。这是由于浮点数的二进制表示无法精确地表示某些十进制小数。

在您的例子中,131072.32 是一个十进制小数,但是在浮点数的二进制表示中可能无法精确表示。因此,当将该十进制小数存储在 float(8,2) 类型的字段中时,可能会出现近似值。

要更精确地表示小数,可以考虑使用 decimal 类型而不是 float 类型。decimal 类型以字符串形式存储数字,并且可以精确表示指定的小数位数。

例如,可以将字段类型更改为 decimal(8,2),这将使用 8 个字节的存储空间,并且保留两位小数。这样,131072.32 将以精确的方式存储和表示。

请注意,使用 decimal 类型可能会导致一些性能上的损失,因为它需要更多的存储空间和计算资源。因此,在选择数据类型时,请根据实际需求和性能要求进行权衡。

1 个赞

这个应该是已知的float精度问题。

131072.32转换成二进制
100000000000000000.0101000111101011100001010001111010111000010100011111
截取24位
100000000000000000.010100
转换成十进制
131072.3125
按精度四舍五入
131072.31

float、double精度可能丢失,decimal精度不会丢失,所以建议decimal来存储金额值。

2 个赞

金钱的还是用decimal 好,精度准

所以是float是转换成二进制存储的,decimal不是吗

mysql数据库的舍入模式,decimal是四舍五入,float和 double是四舍六入五成双
四舍,小于等于四舍去,
六入,大于等于六则加一
五成双,是五的话看前一位是双数还是单数,单则加一,双的则看5后面的大于0则进位,等于0则舍去

1 个赞

float 在内存中占4个字节,double 在内存中占8个字节。
浮点数的存储是依照IEEE754标准,指数位用移码表示,尾数用原码表示,且省略1。所以float尾数位为24,double尾数位为64。

对float: 指数为移码 = 011111111+偏移量
对double:指数为移码 = 01111111111+偏移量
————————————————
版权声明:本文为CSDN博主「xiebs_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:4、浮点数的秘密_float的尾数-CSDN博客

是的,所以一般还是用decimal吧

1 个赞

学习了

:handshake: :handshake: :handshake:

1 个赞

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。