ブログ

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

EC2のWebサーバにSSLを導入する

個人情報を扱う会員制サイトには必須の存在であるSSL。 HTTP経由で通信されるバイト情報を、暗号化して情報の漏洩を防ぐのが目的だ。 個人情報を扱うサイトで、URLの先頭がhttpsになっていないペー …

no image

固定IPにElasticIP

固定IPを割り振るには、やはりElasticIPを使うので正解でした。 左メニューの中から「Elastic IP」を選びます。 取得するのは非常に簡単なので詳細は割愛。 「Allocate New A …

no image

GITサーバにssh接続でpermission denied(publickey)

GITサーバにSSH経由でpushするときにエラー発生。 Permission denied (publickey). 接続時になにかエラーが起きているようだ。 それを調べるには「-vvv」オプション …

no image

MySQL5.1→5.6 アップデート

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

GMOクラウド(Altus)IPベースのSSL設置に注意

GMOクラウド(Altus)はNATが使われている GMOクラウド(Altus)では、NAT機能が使われている。 NATとは、グローバルIPアドレスをローカルIPアドレスに変換する機能のこと。 &nb …