phpのnumber_format関数について。

WBOY
リリース: 2016-06-23 14:14:48
オリジナル
1326 人が閲覧しました

echo number_format(88899626759579787, 0, '', '');
出力結果が 88899626759579792 なのはなぜですか?


ディスカッションへの返信 (解決策)

私も初心者なので、Niang Du に尋ねたところ、彼女はこう言いました。形式が間違っているということです!

http://www.w3school.com.cn/php/func_string_number_format.asp より

環境は 32 ビットである必要があるため、上記の数値 88899626759579787 を表すには、浮動小数点型と浮動小数点の精度を使用する必要があります。タイプは保証する方法はありません


この例を通してそれを知ることができます

echo PHP_INT_MAX; // php的整形能表示的最大整数var_dump(number_format(88899626759579700, 0, '', ''));
ログイン後にコピー
ログイン後にコピー

投稿する際に環境について書くか迷いました

開発環境はwin7 64bitです。 centOS 64bit でも同じエラーが発生します
他の API からインポートされた数値です
使用されている strval 関数が使いにくいです。ありがとうございます!

あなたの環境は 32 ビットである必要があるため、上記の数値 88899626759579787 を表すには浮動小数点型を使用する必要があります

この例を通してそれを知ることができます。

echo PHP_INT_MAX; // php的整形能表示的最大整数var_dump(number_format(88899626759579700, 0, '', ''));
ログイン後にコピー
ログイン後にコピー

さらに、API は json_decode() を使用しますが、自動的に数値型に変換されるようです

そして、php のバージョンも 64 ビットです。 #1 が言ったとおりです

#1 を押してみましたか? 私が言ったことを変更しましょう

16 桁の数値は適切です

PHP の長い型は、そのような大きな正の数を表すことはできません

PHP の開発。組織は win 用の 64 ビット バージョンをリリースしたことがありません


可能であれば、php5.4 以降にアップグレードするのが最善です。なぜなら、php は 5.4 で json_decode にパラメータを追加したからです。

5.4.0 options パラメータが追加されました。 JSON デコード オプションのビットマスクは現在 JSON_BIGINT_AS_STRING のみがサポートされています (デフォルトでは大きな整数を浮動小数点数としてキャストします)

<?php$json = '12345678901234567890';var_dump(json_decode($json));var_dump(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));?>以上例程会输出:float(1.2345678901235E+19)string(20) "12345678901234567890"
ログイン後にコピー
ログイン後にコピー

アップグレードできない場合は、最初に int を超えるすべての数値テキストに特別な識別子を追加することをお勧めします。

{"a":"12345678901234567890"} などの長さ

{"a":"__12345678901234567890"} に置き換えることができます
json_decode が完了したら、__ ロゴを削除します

可能であれば、アップグレードすることをお勧めしますphp5.4以降、phpは5.4であるため、json_decodeにパラメータを追加します

JSONデコードオプションのビットマスクが追加されました。現在、JSON_BIGINT_AS_STRINGのみがサポートされています(デフォルトは大きな整数をキャストします)。 floats)

<?php$json = '12345678901234567890';var_dump(json_decode($json));var_dump(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));?>以上例程会输出:float(1.2345678901235E+19)string(20) "12345678901234567890"
ログイン後にコピー
ログイン後にコピー


アップグレードできない場合は、最初に int の長さを超えるすべての数値テキストに、
{"a":"12345678901234567890"} などの特別な識別子を追加することをお勧めします。

{"a":"__12345678901234567890"} に置き換えてください

json_decode が完了したら、__ ロゴを削除してください
詳細な回答ありがとうございます
バージョンアップできない場合の方法と同様に解決しました。
開発環境で取得されたデータが範囲外であるだけであり、実際の運用環境では範囲外の問題は発生しません
したがって、解決策は文字列解析メソッドで解決されます
最後に。ポストの

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート