jQuery Ajax向PHP传输十进制值出现非预期舍入如何解决?
问题原因说明
PHP的$_POST默认会将传入的数值作为字符串接收,本身不会自动对十进制数做取整处理,你遇到的舍入问题基本来自以下两个核心原因:
- 数据库
lat、lng字段的decimal精度设置不足,比如设置为DECIMAL(2,0)就只会保留整数部分,经纬度场景至少需要DECIMAL(10,6)才能满足常用的米级定位精度需求 - 直接将未处理的POST参数拼接进SQL语句,存在数值隐式转换导致精度丢失的问题,同时还会引发SQL注入安全风险
修复步骤
1. 调整数据库字段精度
先执行SQL修改表字段精度,确保可以容纳完整的经纬度小数位:
ALTER TABLE `markers` MODIFY COLUMN `lat` DECIMAL(10,6) NOT NULL, MODIFY COLUMN `lng` DECIMAL(10,6) NOT NULL;
2. 改写PHP代码使用预处理语句
改用mysqli预处理+参数绑定的方式执行SQL,既能避免注入风险,也能保证数值精度不丢失:
<?php include ('database_connect.php'); // 先校验参数合法性 if (!isset($_POST['lat'], $_POST['lng']) || !is_numeric($_POST['lat']) || !is_numeric($_POST['lng'])) { echo "参数非法"; exit; } $lat = (float)$_POST['lat']; $lng = (float)$_POST['lng']; // 预处理SQL $stmt = $conn->prepare("INSERT INTO `markers` (`lat`, `lng`) VALUES (?, ?)"); // 绑定两个double类型的参数 $stmt->bind_param("dd", $lat, $lng); if ($stmt->execute()) { echo "success"; } else { echo "fail: " . $stmt->error; } $stmt->close(); $conn->close(); ?>
可选排查方式
如果修改后仍有问题,可以在PHP代码最开头加入以下代码,验证PHP接收的原始数值是否正确:
var_dump($_POST['lat'], $_POST['lng']); exit;
如果输出结果和你发送的32.58285、57.38373一致,说明传输环节无异常,问题出在数据库配置或SQL执行环节。
内容的提问来源于stack exchange,提问作者Colin Davis
相关产品推荐
相关产品推荐

