[解決済み] PHP - 浮動小数点数の精度 [重複]。
2023-02-25 18:06:17
質問
$a = '35';
$b = '-34.99';
echo ($a + $b);
結果:0.00999999998
どうしたんだろう?なぜ私のプログラムは奇妙な結果を報告し続けるのだろうかと思いました。
なぜPHPは期待される0.01を返さないのでしょうか?
どのように解決するのですか?
浮動小数点演算=実数演算だからです。不正確さによる違いの説明として、ある浮動小数点に対して
a
と
b
,
(a+b)-b != a
. これはfloatを使うどの言語にも当てはまります.
から 浮動小数点 は有限の精度を持つ2進数であることから 表現可能な数 となり、その結果 精度の問題 といった驚きがあります。もうひとつ興味深い読み物があります。 すべてのコンピュータ科学者が浮動小数点演算について知っておくべきこと .
問題に戻りますが、基本的に 2 進法では 34.99 や 0.01 を正確に表現する方法がないため (10 進法では 1/3 = 0.3333... のように)、代わりに近似値を使用することになります。この問題を回避するには、次のようにします。
-
使用する
round($result, 2)
を使って小数点以下2桁に丸めることができます。 -
整数を使用します。それが通貨、例えば米ドルであれば、35.00ドルを3500、34.99ドルを3499として格納し、結果を100で割ります。
関連
-
[解決済み】接続の取得に失敗しました: php_network_getaddresses: getaddrinfo failed: 名前またはサービスが不明
-
[解決済み】foreach()に与えられた引数が無効です。)
-
[解決済み】 libapache2-mod-php7 パッケージが見つからない。
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
-
[解決済み] PHPのエラーを表示させるにはどうしたらいいですか?
-
[解決済み] PHPでパスワードをハッシュ化するためにbcryptを使用するにはどうすればよいですか?
-
[解決済み] JavaScriptで浮動小数点数の精度を扱うには?
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】PHP - 構文エラー、予期しないT_CONSTANT_ECAPSED_STRING [閉店].
-
[解決済み】XAMPPポート80をPID 4の「Unable to open process」が使用中 [重複] XAMPPポート80をPID 4の「Unable to open process」が使用中。]
-
[解決済み】Weird PHP error: 'Can't use function return value in write context'.
-
[解決済み】foreach()に与えられた引数が無効です。)
-
[解決済み] $wpdb->update または $wpdb->insert を実行すると、引用符の前にスラッシュが追加される
-
[解決済み】PHPからPythonスクリプトを実行する
-
[解決済み] SQLSTATE[HY093]: 無効なパラメータ番号: パラメータが定義されていません
-
[解決済み】PHP フェイタルエラー。未定義の関数mssql_connect()をコールしています。
-
[解決済み】SSLピア証明書またはSSHリモートキーがOKでなかった
-
[解決済み】Netbeans 7.4 for PHPで「スーパーグローバルな$_POST配列に直接アクセスしないでください」という警告が発生する。