2013-08-21 3 views
5

デフォルトでは、mysqliはすべての値を文字列として返します。MYSQLI_OPT_INT_AND_FLOAT_NATIVEオプションを使用すると、intとfloatを適切な型に変換できます。これは小数フィールドには影響しませんが。PHPで文字列として返されるMySQLの小数フィールド

手動で$value = (float) $row->some_decimal_fieldを呼び出すことなく、すべての小数フィールドをPHPの浮動小数点型に自動的にキャストする方法はありますか?

答えて

1

私はそれを非常に疑っています。小数点は固定小数点数を使用し、PHPにはこれを提供できるデータ型はありません。浮動小数点数は近づきますが、実際には丸められています。つまり、浮動小数点数に2を代入すると、代わりに1.99999999999999999になります。したがって、MySQLがPHPの浮動小数点数を10進数で取得する方法を提供していても、10進数から浮動小数点数にキャストすることによってデータが失われる危険性があります。

これをきれいに処理するには、GMPのようなものが必要ですが、おそらくMySQLは自動的にそれを提供することはできません。 PHPで手動で行う必要があります。ここで

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が自動的に変換を行います。 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 
+0

ここでは簡単なテストです。上記のようにGMPを使用しないと、奇妙な結果や奇妙な近似値が得られます。 –

+0

あなたの権利はOKですが、それは正解ではないかもしれませんが、それは同じように探している人を助けるかもしれない答えです。 – amaster

関連する問題