我试图将这个函数从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上使用过一个过程或函数,所以我不知道我可能错过了什么。我试图使十进制变量小数点(11,8),但它也没有工作。有人需要帮忙吗?
发布于 2017-11-01 19:51:40
当您使用浮点数进行计算时,计算不是简单的(加法、乘法),当小计超出数据类型的界限时(特别是当您使用小数点而没有标度和精度时),最好使用浮点数类型。你可以在最后选择你想要的结果是多少小数。
https://stackoverflow.com/questions/47062210
复制相似问题