0
我设置了一些表的列类型为float,长度为53,设置它的值为38.8, 当我使用sqlsrv驱动程序进行查询时,没关系,它的显示值是38.8。 但是,当我使用pdo_sqlsrv驱动程序的查询,它的显示值是38.799999999999997, 这是为什么?当转换为二进制pdo_sqlsrv驱动程序如何将float类型转换为字符串?
我设置了一些表的列类型为float,长度为53,设置它的值为38.8, 当我使用sqlsrv驱动程序进行查询时,没关系,它的显示值是38.8。 但是,当我使用pdo_sqlsrv驱动程序的查询,它的显示值是38.799999999999997, 这是为什么?当转换为二进制pdo_sqlsrv驱动程序如何将float类型转换为字符串?
十进制数38.8是periodic:
100110.1100110011001100110011001100110011001100110011001100110011001100110
^^^^
Repeats forever
因此,不能准确地存储在一个计算机如果选择一个常规的数字格式(其总是具有固定的存储大小)。
它并不真正的问题:
ini_set('precision', 30);
var_dump(38.8, number_format(38.8, 8));
float(38.7999999999999971578290569596)
string(11) "38.80000000"
但是,如果8 日:因为你建立你只需要8位小数,你应该放弃休息时得到正确的值十进制对你来说很重要,你应该将列类型切换为DECIMAL
,它将内部数字存储为字符串,从而保持精确的十进制表示形式。
所有浮点数(在数据库或代码中)不存储精确的十进制值。看到我之前写的这个答案 - 同样的事情适用。 http://stackoverflow.com/a/12291065/1450077 – Fluffeh 2014-10-09 08:14:39