ブログ

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

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

関連記事

無料SSLと有料SSLの違いって何?メリデメ紹介

目次 無料SSLは危険?セキュリティ危ないの?無料SSLのセキュリティは大丈夫?有料と無料で何が違うのか?1.費用の違い2.サポートの有無3.付加サービスの有無有料が無難でオススメ!無料は使い所大事! …

no image

EC2にEC-CUBEでTimezone

EC2→RDS(Mysql)でEC-CUBEを導入します。 導入手順 1.EC2インスタンス作成(t2.micro) 2.RDSインスタンス作成(t2.micro) 3.EC2にLAMP環境構築 4. …

no image

RDSを無料にするには、Backup設定も加味する必要があった

RDSでmysqlサーバを構築した。 容量は20GBで無料枠にしたつもりだった。 しかし、どうもそれだけでは足りないらしい。 ▼このサイトが参考になりましたよ http://goo.gl/kZxWHD …

no image

RDSでDBインスタンスを無料枠で作成する

EC2を使ってWEBサーバは作った。 次はデータベースサーバを作りたい。 せっかくだから、データベースサーバは別サーバにしたい。 リソースをWEBサーバとDBサーバとで分離したいのだ。 まず、DBサー …

no image

MySQL5.1→5.6 アップデート

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