【问题标题】:MySQL decimal fields returned as strings in PHP在 PHP 中以字符串形式返回的 MySQL 十进制字段
【发布时间】:2013-08-21 16:12:32
【问题描述】:

默认情况下,mysqli 将所有值作为字符串返回,MYSQLI_OPT_INT_AND_FLOAT_NATIVE 选项允许您将整数和浮点数转换为适当的类型。虽然这不会影响十进制字段。

有没有办法在不手动调用$value = (float) $row->some_decimal_field的情况下自动将所有十进制字段转换为php浮点类型?

【问题讨论】:

    标签: php mysql string casting decimal


    【解决方案1】:

    我非常怀疑。小数使用定点数学,PHP 中没有数据类型可以提供这一点。浮点数很接近,但它们实际上是四舍五入的,这意味着将 2 分配给浮点数可能会导致 1.99999999999999999 代替。因此,即使 MySQL 提供了一种将小数转换为 PHP 浮点数的方法,您也存在将小数转换为浮点数的风险。

    要干净利落地处理这个问题,您需要GMP 之类的东西,但您可能猜到MySQL 无法自动为您提供。您需要在 PHP 中手动完成。

    【讨论】:

    • 答案是正确的 (+1),但是值 2 的示例不正确。常见的 IEEE 754 浮点表示(PHP uses)可以精确表示 2。一个更好的例子是 0.1,它不能被精确表示并且更像 0.10000000000000009
    【解决方案2】:

    你可以用 PHP 做一些事情来解决这个问题:

    function string_to_float($foo){
        if($foo*1==$foo && !empty($foo)){
            return $foo*1;
        } else {
            return $foo;
        }
    }
    
    string_to_float($row->some_decimal_field);
    

    真正的问题是,为什么需要转换十进制字符串的类型?如果你想在数学中使用它,php 会自动为你进行转换。因为十进制字符串等价于具有相同值的浮点数。这是一个简单的测试:

    $foo = "1.2";
    $bar = 1.2;
    
    
    if($foo===$bar){
      $equivalent = "is";
    } else {
      $equivalent = "is not";
    }
    
    print '"1.2" '.$equivalent.' equal to 1.2 in type and value<br />';
    
    if($foo==$bar){
      $equivalent = "is";
    } else {
      $equivalent = "is not";
    }
    
    print '"1.2" '.$equivalent.' equal to 1.2 in value<br />';
    
    $foo = "1.2"*1;
    $bar = 1.2;
    
    if($foo===$bar){
      $equivalent = "is";
    } else {
      $equivalent = "is not";
    }
    
    print '"1.2"*1 '.$equivalent.' equal to 1.2 in type and value<br />';
    

    将返回:

    "1.2" is not equal to 1.2 in type and value
    "1.2" is equal to 1.2 in value
    "1.2"*1 is equal to 1.2 in type and value
    

    【讨论】:

    • 如果您使用普通运算符对字符串进行任何数学运算,您会将定点数据类型转换为浮点数据类型。如果你不使用上面提到的 GMP,你会得到奇怪的结果或奇怪的近似值。
    • 好吧,这可能不是正确的答案,但它可能会帮助其他希望这样做的人。
    猜你喜欢
    • 2017-08-11
    • 2021-12-19
    • 1970-01-01
    • 2013-01-15
    • 2022-01-03
    • 1970-01-01
    • 2013-02-11
    • 2018-01-16
    • 2021-07-07
    相关资源
    最近更新 更多