15年間WEB業界にいて恥ずかしながら本日初めて
JavaScriptは小数点の計算が出来ないことを知りました
例
3万円+消費税(8%)を求めたい
というよくありそうな極々簡単な計算式
alert(30000*1.08);
計算結果は当然32,400円
しかし
JavaScriptの出す結果は「32400.000000000004」
これはJavaScriptは
IEEE754 浮動小数点数算術標準に準拠しているためのバグ仕様ということが分かりました
そして、ここからが質問なのですが
JavaScriptだけではなくPHPもIEEE754に準拠しているとのことなのですが
http://php.net/manual/ja/language.types.float.php
浮動小数点数の精度は有限です。 システムに依存しますが、PHP は通常 IEEE 754 倍精度フォーマットを使います。 この形式は、1.11e-16 のオーダーでの丸め処理で誤差が発生します。 複雑な算術演算をすると、誤差はさらに大きくなるでしょう。そしてもちろん、 いくつかの演算を組み合わせる場合にも誤差を考慮しなければなりません。
さらに、十進数では正確な小数で表せる有理数、たとえば 0.1 や 0.7 は、 二進数の浮動小数点数としては正確に表現できません。 これは、仮数部をいくら大きくしても同じです。 したがって、それを内部的な二進数表現に変換する際には、どうしても多少精度が落ちてしまいます。 その結果、不思議な結果を引き起こすことがあります。たとえば、 floor((0.1+0.7)*10) の結果はたいてい 7 となるでしょう。おそらくは 8 を想定していらっしゃるでしょうが、そのようにはなりません。 これは、(この計算結果の) 内部的な値が 7.9999999999999991118... のようになっているからです。
よって、小数の最後の桁を信用してはいけませんし、 小数を直接比較して等しいかどうかを調べてはいけません。より高い精度が必要な場合には、 任意精度数学関数または gmp 関数を代わりに使用してください。
試しにPHP(5.3.3)にて同じ計算をしたところ
echo 30000 * 1.08;
結果は「32400」という正常(一般的な電卓と同じ結果というほうが正確?)な値になるようでした
このPHPとJavaScriptの差はなにによるものなのでしょうか?
IEEE754に準拠は曖昧なものなのでしょうか
お忙しい中恐縮ですが分かる方お教えくださいませ
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/23 09:04
2018/08/23 09:07
2018/08/24 07:18
2018/08/24 07:21