Mysql 为什么sum()查询返回的结果包含更多小数点?

Mysql 为什么sum()查询返回的结果包含更多小数点?,mysql,floating-point,sum,decimal,Mysql,Floating Point,Sum,Decimal,上图显示了我的数据库表中名为“igstAmt”的一列。 当我使用查询时,选择sum(igstAmt)正如salesinvoice中的igstAmt一样,它返回的值21616.7500129491带有许多小数点,但正确答案是21616.75。我知道我可以在显示时对结果进行四舍五入,我想知道为什么会发生这种情况?该列中条目的最大小数点数为2,因此结果为它还应该有2个小数点,对吗?列的数据类型是float该float数据类型不使用十进制数字表示数字。它使用二进制数字表示数字,因此数字中的二进制数字表示

上图显示了我的数据库表中名为“igstAmt”的一列。
当我使用查询时,选择sum(igstAmt)正如salesinvoice中的igstAmt一样,它返回的值
21616.7500129491
带有许多小数点,但正确答案是
21616.75
。我知道我可以在显示时对结果进行四舍五入,我想知道为什么会发生这种情况?该列中条目的最大小数点数为2,因此结果为它还应该有2个小数点,对吗?列的数据类型是
float

float
数据类型不使用十进制数字表示数字。它使用二进制数字表示数字,因此数字中的二进制数字表示两个的幂,例如16、8、4、2、1、½、¼,⅛, 等等

显示为“272.7”、“0.55”等的数字不是存储值的准确表示。例如,显示为“272.7”的数字实际上可能是272.70001220703125

用于为输出设置数字格式的规则可能会通过使用少于显示准确值所需的所有数字来隐藏这些差异


当您添加这些数字时,实际数字和附近的十进制表示之间的差异可能会增大或减小,这取决于差异之间的偶然变化。您看到的总和是这些添加的自然结果。

如果您的数据类型是十进制(16,2)然后它会像你期望的那样返回,因为它是浮点型的,这就是为什么它是这样的我想知道,查询是如何找到2个小数点后的值的?这是因为数据类型Google“浮点精度”。更改为
decimal
数据类型将解决问题,或者你可以使用四舍五入。使用
decimal(m,n)
用于存储“货币”;对于“科学”值,使用
FLOAT
DOUBLE
进行存储。更准确地说,我可以通过以单精度(binary32)存储值来重新创建结果,但以双精度(binary64)计算总和。@SimonByrne-这是因为
FLOAT
仅包含24位精度(大约7位有效十进制数字)和
DOUBLE
使用53位(大约16位)。请注意,在大约7位“好”数字之后,长数字是如何变酸的。