PHP使用sqlsrv从MS SQL获取real类型值异常,求正确获取方法
解决SQL Server real字段在PHP sqlsrv中精度异常的问题
这个问题本质是单精度浮点数(real类型)的固有特性导致的:SQL Server的real是32位单精度浮点数,它无法精确存储很多十进制小数(比如2.2),只能存储近似值。SQL Server Management Studio(SSMS)在显示时会自动做四舍五入处理,让你看到“正确”的2.2,但数据库里实际存储的就是那个带尾巴的近似值——PHP的sqlsrv驱动只是如实返回了这个原始值而已。
下面给你几个可行的解决办法:
改用高精度字段类型(推荐)
把real字段改成decimal(p,s)(定点数,能精确存储小数)或者float(SQL Server的float是64位双精度,精度比real高很多,误差极小)。比如要存储一位小数的数值,可以用decimal(10,1):ALTER TABLE test ALTER COLUMN a decimal(10,1);改完后不管是SSMS查询还是PHP读取,都能得到精确的2.2。
在SQL查询时格式化转换
如果没法修改表结构,可以在查询时直接处理数值,返回格式化后的值:-- 四舍五入到1位小数 SELECT ROUND(a, 1) AS a FROM test; -- 或者转换为字符串,避免浮点数显示问题 SELECT CONVERT(varchar(20), a, 128) AS a FROM test;这样PHP拿到的就是处理后的精确值。
在PHP端处理原始值
如果必须拿到原始浮点数后在PHP里调整,可以用round()函数指定精度,或者用number_format()格式化:// 假设从结果集中取出的值是$row['a'] $rawValue = $row['a']; // 四舍五入到1位小数 $fixedValue = round($rawValue, 1); // 或者格式化为字符串 $formattedValue = number_format($rawValue, 1, '.', '');不过这种方法要注意极端情况(比如某些近似值刚好卡在四舍五入边界),所以优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者Piotr Nowicki
相关产品推荐
相关产品推荐

