hamacoの日記

どうでもいい日常をたれながす日記だと思う

=ROUNDUP(2/0.9*1.35, 0) の結果が Excel だと 3 になるけど、PhpSpreadsheet だと 4 になるので、PhpSpreadsheet のバグを見つけたかと思ったけど単に浮動小数点の誤差だった件。

お仕事で PhpSpreadsheet を使って Excel からデータを取得しているんだけど、どうしても完全再現はできないからたまにおかしくなる時があり、今回も非対応のなにかを使ってしまったのかなーと思っていたら違った。 上の計算を電卓で叩くと 2.999999 になるから最初はなにかのバグかなーと思っていたんだけど、試しにふと psysh で叩いてみると 3.0 になったのでなんか気になり、これ丸められてるのかな?って sprintf 叩いたらビンゴ。

<?php

echo 2 / 0.9 * 1.35; // 3.0

echo sprintf('%.40f', 2 / 0.9 * 1.35); // 3.0000000000000004440892098500626161694527

なんかこの sprintf('%.40f') 忘れそうなのでメモっておこう。