7

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

有没有办法自动将所有十进制字段转换为 php float 类型而无需手动调用$value = (float) $row->some_decimal_field

4

2 回答 2

6

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

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

于 2013-08-21T16:37:46.450 回答
0

您可以使用 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
于 2013-08-21T16:46:04.140 回答