Chapter 17

[PG] 任意精度数学関数 と 倍精度浮動小数点

at yasu
at yasu
2022.05.23に更新

小数点以下のビット演算がややこしくて把握しとらん馬鹿者です、こんにちは。

IEEE 754 -- wikipedia での小数点の扱いに関する事です。知っているけど把握しとらんのよなぁ…

小数点の扱い

標準関数の round などで小数点以下の計算しているとわかるのですが、小数点がある計算をコンピューターでするのは注意が必要です。

例えば (0.1 + 0.7) * 10 の小数点以下切り捨てをすると 8 を期待します。しかし PHP では floor((0.1+0.7)*10) === 7.0 が真になります。Javascript でも Math.floor((0.1+0.7)*10) === 7.0 が真になります。

類似として 0.1 + 0.2 !== 0.3 があります。

PHP での対策

対策として PHP では以下の方法が取られます。

  1. BCMath を使う。

    任意精度数学関数(bcmath)は、PHP側では文字列でやり取りするので期待する数値になります。期待通りの数字にならない時は、有効所数点の位置を間違えている等があります。

    例えば bcadd("0.1", "0.2") === "0"bcadd("0.1", "0.2", 1) === "0.3" となります。

    使う時は文字列に変換をする必要がありますが、ネイピア数の表記には未対応だったり、Locale によっては小数点がコンマになって上手く処理できない等があるので注意が必要です。

    see : https://www.php.net/manual/ja/intro.bc.php

JS での対策

わからない…

参考

see