わからないこと&解決したいこと
小数第10位まで正確に計算したくて、BCMath関数を使用しておりました。
(加算、減算、割り算、掛け算 全て使用)
ふと、本当に正確なのか気になって
シンプルな値でBCMathの動きをテストしました。
すると、
bcadd()にて下記2つの数値を足すと結果が0になってしまいました。
数値1: 0.0000000100
数値2: 0.0000000200
合計: 0.0000000300 //この値が欲しい。
※ちなみに、通常の"+"を使用して上記の加算を行ったところ問題無く結果が得られました。
ただそれは一旦置いておき、なぜbcadd()だと上手くいかないのかとても疑問に思い夜も眠れません。
試したコード
▼ "bcadd()"を使った加算 その1 $n1 = 0.0000000100; $n2 = 0.0000000200; $sum = bcadd($n1, $n2, 10); echo sprintf('%.10f', $sum).PHP_EOL; //出力結果: 0.0000000000 //0になってしまった。 ▼ "bcadd()"を使った加算 その2 $n1 = 1.0000000100; //1を足してみた $n2 = 1.0000000200; //1を足してみた $sum = bcadd($n1, $n2, 10); echo sprintf('%.10f', $sum).PHP_EOL; //出力結果: 2.0000000300 //正確に計算できている。。なぜなんだろう ▼ "+" を使った加算 $n1 = 0.0000000100; $n2 = 0.0000000100; $sum = $n1 + $n2; echo sprintf('%.10f', $sum).PHP_EOL; //出力結果: 0.0000000200 //正確に計算できている
お願い
加算にはbcadd()ではなく通常の"+"をつかうべきなんでしょうか。
皆さんどうされているのでしょうか。
よろしくお願い致します。
追加テストコード
(上記に書いたように)初めに1を足しておくと正確な計算が出来ているようなので、
1ではなくもう少し小さい値にしたらどうなるのかと気になり、テストしてみました。
結果概要:
初めに足しておく値が少なくとも「0.0001」より小さくなると、計算が上手くいかないという事実が分かりました。
この結果が何を意味しているのかは全く分かりませんが、とりあえず報告致します。
▼0.1を足しておく $n1 = 0.1000000100; $n2 = 0.1000000200; $sum = bcadd($n1, $n2, 10); echo sprintf('%.10f', $sum).PHP_EOL; //0.2000000300 //正確 ▼0.01を足しておく $n1 = 0.0100000100; $n2 = 0.0100000200; $sum = bcadd($n1, $n2, 10); echo sprintf('%.10f', $sum).PHP_EOL; //0.0200000300 //正確 ▼0.001を足しておく $n1 = 0.0010000100; $n2 = 0.0010000200; $sum = bcadd($n1, $n2, 10); echo sprintf('%.10f', $sum).PHP_EOL; //0.0020000300 //正確 ▼0.0001を足しておく $n1 = 0.0001000100; $n2 = 0.0001000200; $sum = bcadd($n1, $n2, 10); echo sprintf('%.10f', $sum).PHP_EOL; //0.0002000300 //正確 ▼0.00001を足しておく $n1 = 0.0000100100; $n2 = 0.0000100200; $sum = bcadd($n1, $n2, 10); echo sprintf('%.10f', $sum).PHP_EOL; //0.0000000000 //0になった。。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/30 05:44