php - 带一个PHP函数到Mysql,使用十进制数

标签 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 上使用过过程或函数,所以我不知道我可能会丢失什么。我试图使十进制变量为 decimal(11,8),但它也没有用。 有人能帮忙吗?

最佳答案

当您使用 float 进行计算时,计算不是简单的计算(加法、乘法)并且当小计超出数据类型的界限时(尤其是当您使用没有小数位数和精度的小数时),您最好使用 float 据类型。您可以在最后选择结果的小数位数。

关于php - 带一个PHP函数到Mysql,使用十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47062210/

相关文章:

mysql - Laravel 5.2 Eloquent 关系

java - 如何避免在我的 MySQL 数据库中输入重复条目?

php - 如果我只知道那个文本,如何知道哪个字符集在 MySql 数据库的文本字段中

php - Laravel , mysql 表情符号另存为问号

php - 如何使用 PHP SDK 获取 LINE 用户中间?

php - 用于 Sendgrid API 的 php 的 curl -d 选项

php - 在 PHP/MySQL/PDO 中创建个人资料信息页面

php - 使用来自 xml 的 php 显示数据

PHPMYadmin 表迁移

java - 如何使一个值的外键显示在primefaces数据表中