默认情况下,mysqli将所有值作为字符串返回,MYSQLI_OPT_INT_AND_FLOAT_NATIVE
选项允许您将整数和浮点数转换为适当的类型。虽然这不会影响十进制字段。
有没有办法在不手动调用$value = (float) $row->some_decimal_field
的情况下自动将所有小数字段转换为php float类型?
答案 0 :(得分:3)
我非常怀疑。小数使用定点数学,PHP中没有可以提供此数据类型的数据类型。浮点数接近,但它们实际上是四舍五入的,这意味着为浮点数赋值2可能会导致1.99999999999999999。因此,即使MySQL提供了一种将小数写入PHP浮点数的方法,也可以通过从小数转换为浮点数来丢失数据。
要干净利落地处理这个问题,你需要像GMP这样的东西,但你可能会猜到MySQL无法自动为你提供。您需要在PHP中手动完成。
答案 1 :(得分: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将自动为您进行转换。十进制字符串相当于具有相同值的float。这是一个简单的测试:
$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