我试图将此功能从 php 转移到 mysql:
function distancia($p1LA, $p1LO, $p2LA, $p2LO) {
$r = 6371.0;
$p1LA = $p1LA * pi() / 180.0;
$p1LO = $p1LO * pi() / 180.0;
$p2LA = $p2LA * pi() / 180.0;
$p2LO = $p2LO * pi() / 180.0;
$dLat = $p2LA - $p1LA;
$dLong = $p2LO - $p1LO;
$a = sin($dLat / 2) * sin($dLat / 2) + cos($p1LA) * cos($p2LA) * sin($dLong / 2) * sin($dLong / 2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
return round($r * $c * 1000);
}
在 mysql 上,我这样做:
DELIMITER |
CREATE FUNCTION Distancia (la1 DECIMAL, lo1 DECIMAL, la2 DECIMAL, lo2 DECIMAL)
RETURNS DECIMAL
DETERMINISTIC
BEGIN
DECLARE r DECIMAL;
DECLARE la1aux DECIMAL;
DECLARE lo1aux DECIMAL;
DECLARE la2aux DECIMAL;
DECLARE lo2aux DECIMAL;
DECLARE retorno DECIMAL;
DECLARE dLat DECIMAL;
DECLARE dLong DECIMAL;
DECLARE a DECIMAL;
DECLARE c DECIMAL;
SET r = 6371.0;
SET la1aux = la1 * pi()/180.0;
SET lo1aux = lo1 * pi()/180.0;
SET la2aux = la2 * pi()/180.0;
SET lo2aux = lo2 * pi()/180.0;
SET dLat = la2aux - la1aux;
SET dLong = lo2aux - lo1aux;
SET a = sin(dLat / 2) * sin(dLat / 2) + cos(la1aux) * cos(la2aux) * sin(dLong / 2) * sin(dLong / 2);
SET c = 2 * atan2(sqrt(a), sqrt(1 - a));
SET retorno = round(r * c * 1000);
RETURN retorno;
END|
我在 mysql 上调用函数是这样的:
select Distancia(-46.61579100, -23.54247250, -46.61354560, -23.54093070)/1000;
结果应该是 0.276。但我得到 0。我以前从未在 mysql 上使用过过程或函数,所以我不知道我可能会丢失什么。我试图使十进制变量为 decimal(11,8),但它也没有用。 有人能帮忙吗?
最佳答案
当您使用 float 进行计算时,计算不是简单的计算(加法、乘法)并且当小计超出数据类型的界限时(尤其是当您使用没有小数位数和精度的小数时),您最好使用 float 据类型。您可以在最后选择结果的小数位数。
关于php - 带一个PHP函数到Mysql,使用十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47062210/