ブログ

PHPでのfloor関数(浮動小数点)での丸め誤差にご注意を!

投稿日:

丸め誤差とは

小数点を扱うときに、切捨てや四捨五入によって微妙に出る誤差のことを「丸め誤差」と呼ぶ。

消費税計算などで起こりやすい事象。

 

あらかじめ、小数以下の扱いルールを明確にして、ルールにのっとって計算をすることで誤差は生じない。

 

浮動小数点による丸め誤差

今回確認した事象は、PHPでの丸め誤差。

 

金額:75.9円

数量:10個

小数ルール:小数以下切捨て

 

上記の場合、単純に計算すると金額は759円となる。

しかし、floor関数を使って計算すると、758円となり1円の誤差が生じる

 

2進数化してから計算

floor関数は計算する前に2進数化してから計算する仕様の様だ。(公式情報

それにより、10進数では75.9でも2進数になると75.89となり、微妙な誤差が生じてしまう。

 

結果として、75.89*10=758.9となり、小数手に以下を切り捨てると758円となる。

 

対処方法

floor関数を使うと誤差が生じてしまうため使えない。

対処としては固定少数化してから整数化(小数以下切捨て)することで対処可能。

 

$total = $price * $quantity;

$value = sprintf(‘%f’, $total); //固定小数化

$value = intval($value) //整数化(小数以下切捨て)

 

小数以下のルールが異なる場合は、適宜読み替えて頂きたい。

 

 

 

 

-ブログ
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

MySQL5.1→5.6 アップデート

MySQLが超高負荷状態で頻繁にロックするため、いろいろ調査した結果、とりあえずバージョンアップは必須。となりました。 ということで、MySQLを5.1→5.6にアップデートしました。 ThinkIT …

no image

s3マウントが解除される

ec2からs3のbucketをマウントして利用している。 これまで数ヶ月特に問題もなく使えていたのだが。 突然接続が解除されてしまった。 ユーザーからファイルのアップロードが出来ないという問合せで気づ …

no image

topコマンドでshift+o が秀逸すぎた

システムの負荷を確認する時によく使うのがtopコマンド。 自分の場合は1秒ディレイで確認することが多い。 ▼コマンド root> top -d 1 1秒間隔で負荷の状態が見えるのはいいが、重いプ …

no image

ELBにSSLを設定する

ELBにSSLを設定してみた。 通常のWEBサーバであれば、取得した公開鍵や証明書をサーバにUPして、Apacheに飲み込ませるのが一般的。 しかし、ロードバランサーを使う場合、大抵の場合はロードバラ …

no image

Billingでコスト管理

AWSは底なしにスケールアップできて堅牢性も高く安全性も高い。 そこまでインフラの知識がなくても、比較的簡単にサーバが作れてします。 一見見た目は、凄く便利でありがたいサービスだ。 しかし、使えば使う …