2014-10-09 21 views
0

我设置了一些表的列类型为float,长度为53,设置它的值为38.8, 当我使用sqlsrv驱动程序进行查询时,没关系,它的显示值是38.8。 但是,当我使用pdo_sqlsrv驱动程序的查询,它的显示值是38.799999999999997, 这是为什么?当转换为二进制pdo_sqlsrv驱动程序如何将float类型转换为字符串?

+2

所有浮点数(在数据库或代码中)不存储精确的十进制值。看到我之前写的这个答案 - 同样的事情适用。 http://stackoverflow.com/a/12291065/1450077 – Fluffeh 2014-10-09 08:14:39

回答

0

十进制数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,它将内部数字存储为字符串,从而保持精确的十进制表示形式。

相关问题