驱动程序如何将浮点类型转换为字符串pdo_sqlsrv


how pdo_sqlsrv driver convert float type to string?

我将某个表的列类型设置为浮点数,长度设置为 53,将其值设置为 38.8,当我使用 sqlsrv 驱动程序进行查询时,没关系,它的显示值为 38.8。但是,当我使用pdo_sqlsrv驱动程序进行查询时,它的显示值为 38.799999999999997,这是为什么?

进制数 38.8 在转换为二进制时是周期性的:

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小数对您来说实际上很重要,则应将列类型切换为 DECIMAL ,它将数字在内部存储为字符串,从而保持精确的十进制表示形式。