web-dev-qa-db-ja.com

PHP StringをFloat / Doubleに変換

文字列(バイト単位のサイズ)のリストがあり、ファイルから読み取ります。文字列の1つが2968789218であるとしますが、浮動小数点数に変換すると2.00になります。

これはこれまでの私のコードです:

$string = "2968789218";
$float = (float)$string;
//$float = floatval($string);
//the result is same
// result 2.00

誰でも?

解決済み

問題は実際にはエンコーディングにありました。ファイルのエンコーディングを変更しても問題ありません:D

18
Bias Tegaralaga

驚くべきことに、受け入れられた答えはありません。この問題は、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_を出力します。

18
Raptor

$ float = floatval($ string);

参照: http://www.php.net/floatval

9
Muya Enzo

使用してみてください

$string = "2968789218";
$float = (double)$string;
5
Sid

関数floatvalが機能しない場合は、これを試してください:

    $string = "2968789218";
    $float = $string * 1.0;
    echo $float;

しかし、私にとっては以前の答えはすべてうまくいきました( http://writecodeonline.com/php/ で試してみてください)おそらく問題はあなたのサーバーにありますか?

0
daarksim