ブログ

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

知らずに使うほど怖いものはない

以前にも述べたように、AWSは底なしに広がるインフラ環境だ。 一見するとすごく便利で良いことづくしにも見えるが、世の中にそんなものは存在しないのだ。 AWSはクラウドにありがちなオンデマンド課金である …

no image

S3からEC2にコマンドでファイルをコピーする

S3に格納したファイルをEC2にコピーする 取得でDVDに保管したい ファイルのリストを作成したい どのようなファイルが入っているかをみたい など、いろんなシーンで使えます。 基本的にS3に入れたもの …

no image

WEBサーバからDBサーバに繋いでみる

RDSを使って、MySQLサーバを作るところまでは、前回の記事で紹介したとおり。 インスタンスは何度も作り直しができるから、1回で上手く行かなくても諦めずに頑張ってね。 さて、EC2でWEBサーバを構 …

no image

nginxを導入してみた

世界的にメジャーなWEBサーバといえば apache (Apache Software Foundation!) IIS (Microsoft) apacheはLinux系のWEBサーバなら大抵の人が …

no image

RDSのtimezoneが"UTC"固定だったとは。。

拡張性もフレキシブルで世界規模で可用性も高いという評判だけど。 やはりそんな単純にはいかないのがインフラの世界。 必ずどこかでハマります EC2⇔RDS(Mysql)でLAMP環境を作ったのですが。 …