文字列(バイト単位のサイズ)のリストがあり、ファイルから読み取ります。文字列の1つが2968789218であるとしますが、浮動小数点数に変換すると2.00になります。
これはこれまでの私のコードです:
$string = "2968789218";
$float = (float)$string;
//$float = floatval($string);
//the result is same
// result 2.00
誰でも?
問題は実際にはエンコーディングにありました。ファイルのエンコーディングを変更しても問題ありません:D
驚くべきことに、受け入れられた答えはありません。この問題は、32ビットPHPにのみ存在します。
ドキュメント から、
文字列に「。」、「e」、または「E」の文字が含まれておらず、数値が整数型の制限(PHP_INT_MAXで定義されている)に適合する場合、文字列は整数として評価されます。それ以外の場合はすべて、floatとして評価されます。
つまり、_$string
_は最初にINTとして解釈され、オーバーフローが発生します(_$string
_値2968789218は最大値を超えます(_PHP_INT_MAX
_)32ビットPHPの2147483647です)、_(float)
_またはfloatval()
。
したがって、解決策は次のとおりです。
_$string = "2968789218";
echo 'Original: ' . floatval($string) . PHP_EOL;
$string.= ".0";
$float = floatval($string);
echo 'Corrected: ' . $float . PHP_EOL;
_
どの出力:
_Original: 2.00
Corrected: 2968789218
_
PHPが32ビットか64ビットかを確認するには、次のようにします。
_echo PHP_INT_MAX;
_
PHPが64ビットの場合、_9223372036854775807
_を出力します。それ以外の場合は、_2147483647
_を出力します。
$ float = floatval($ string);
使用してみてください
$string = "2968789218";
$float = (double)$string;
関数floatvalが機能しない場合は、これを試してください:
$string = "2968789218";
$float = $string * 1.0;
echo $float;
しかし、私にとっては以前の答えはすべてうまくいきました( http://writecodeonline.com/php/ で試してみてください)おそらく問題はあなたのサーバーにありますか?