デフォルトでは、mysqliはすべての値を文字列として返します。MYSQLI_OPT_INT_AND_FLOAT_NATIVE
オプションを使用すると、intとfloatを適切な型に変換できます。これは小数フィールドには影響しませんが。PHPで文字列として返されるMySQLの小数フィールド
手動で$value = (float) $row->some_decimal_field
を呼び出すことなく、すべての小数フィールドをPHPの浮動小数点型に自動的にキャストする方法はありますか?
デフォルトでは、mysqliはすべての値を文字列として返します。MYSQLI_OPT_INT_AND_FLOAT_NATIVE
オプションを使用すると、intとfloatを適切な型に変換できます。これは小数フィールドには影響しませんが。PHPで文字列として返されるMySQLの小数フィールド
手動で$value = (float) $row->some_decimal_field
を呼び出すことなく、すべての小数フィールドをPHPの浮動小数点型に自動的にキャストする方法はありますか?
私はそれを非常に疑っています。小数点は固定小数点数を使用し、PHPにはこれを提供できるデータ型はありません。浮動小数点数は近づきますが、実際には丸められています。つまり、浮動小数点数に2を代入すると、代わりに1.99999999999999999になります。したがって、MySQLがPHPの浮動小数点数を10進数で取得する方法を提供していても、10進数から浮動小数点数にキャストすることによってデータが失われる危険性があります。
これをきれいに処理するには、GMPのようなものが必要ですが、おそらくMySQLは自動的にそれを提供することはできません。 PHPで手動で行う必要があります。ここで
は、あなたが問題を解決するために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が自動的に変換を行います。 10進数の文字列は同じ値を持つ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
ここでは簡単なテストです。上記のようにGMPを使用しないと、奇妙な結果や奇妙な近似値が得られます。 –
あなたの権利はOKですが、それは正解ではないかもしれませんが、それは同じように探している人を助けるかもしれない答えです。 – amaster