You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 10:15:04