Возьмите функцию PHP в Mysql, которая использует десятичные числа

Я пытаюсь взять эту функцию из 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), и это тоже не сработало.
Кто-нибудь с небольшой помощью?

1

Решение

Когда вы выполняете вычисления с плавающими числами, где вычисления не являются простыми (сложение, умножение) и когда промежуточные итоги превышают границы типа данных (особенно если вы используете десятичное число без масштаба и точности), лучше использовать тип данных с плавающей запятой. В конце вы можете выбрать, сколько десятичных разрядов вы хотите получить в результате.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector