質問: 33.65 言語によって、誤差が出るものなのでしょうか? と質問しようと思って、少し続けて検証してみたところ ``` php -r "echo number_format((33.1 + 34.2) / 2,20,null,'');" 33.65000000000000568434 ``` ``` console.log(((33.1 + 34.2) / 2)); 33.650000000000006 ``` と出ました^^; 各言語の計算で、標準で使う変数の型が違うということなんですかね? 詳しい方、コメントいただければ幸いです。
回答: 循環小数という言葉を聞いたことがありますか? 例えば、10進数浮動小数点数で、1/3を表そうとすると、0.33333.... と3を永遠に続けるしか1/3を表現することはできません。(このように、小数点以下の数字が一定のパターン(1/3の例では3が繰り返される)で永遠に続くのを循環小数と言います) 残念ながら、計算機には無限の桁数を表現できるだけのメモリがありませんから、循環小数点数は、どこかの桁以下を近似する(切り捨てる、切り捨てする桁の値で四捨五入する等の処理をする)事で計算機のメモリに数値を保持しています。どこかの桁以下を近似しているので、計算機の中の値は近似値にしかなりません。 このように計算機が数値の表現に使えるデータ(桁数)に限りかあることから、数値を近似せざるを得ず、その近似と正しい値との違いを「近似誤差」「丸めのJ誤差」などと呼びます。 丸目の誤差は、1つの浮動小数点数を2ビットで表現する計算機システムと、64ビットで表現する計算機システムでは異なります。 質問の中で、値が一致しない理由は、この丸目の誤差にあります。