我将一些表的列类型设置为float并将length设置为53,设置它的值为38.8, 当我使用sqlsrv驱动程序查询时,没关系,它的显示值是38.8。 但是,当我使用pdo_sqlsrv驱动程序进行查询时,它的显示值为38.799999999999997, 这是为什么?
答案 0 :(得分:0)
转换为二进制时,十进制数38.8为periodic:
100110.1100110011001100110011001100110011001100110011001100110011001100110
^^^^
Repeats forever
因此,如果您选择常规数字格式(始终具有固定的存储大小),则无法将其精确存储在计算机中。
这并不重要:既然你已经建立了你只需要8位小数,那么在丢弃其余小数时你应该得到正确的值:
ini_set('precision', 30);
var_dump( 38.8, number_format(38.8, 8) );
float(38.7999999999999971578290569596)
string(11) "38.80000000"
但是,如果8 th 十进制对你来说实际上很重要,你应该将列类型切换为DECIMAL
,它在内部将数字存储为字符串,从而保持精确的十进制表示。 / p>