この現象はsprintfの仕様ではなく、小数を計算する際の誤差の問題です。
PHP
1$rentamount = str_replace("万円", "",$url2->rent_amount);//賃料
2$tmp = $rentamount * 10000;
3var_dump($tmp);
4$rent_array[$j] = sprintf('%d',$tmp );
とすると、1少なくなる数を計算した場合、sprintf()に渡される前に n.999999という感じになっているはずです。
PHPに限らず、プログラム言語での小数計算は精度を指定しないと切り捨て問題が発生する可能性があります。
PHP 小数計算 誤差
PHPの場合、これを厳密に解決するには
BC Math関数
を使用する必要があります。
PHP
1<?php
2
3
4$rentamount[] = 8.79 ;
5$rentamount[] = 8.98 ;
6$rentamount[] = 9.12 ;
7
8
9foreach($rentamount as $key => $val){
10 $rent_array[] = bcmul($val , 10000,0);
11
12}
13
14var_dump($rent_array);
15/*
16array(3) {
17 [0]=>
18 string(5) "87900"
19 [1]=>
20 string(5) "89800"
21 [2]=>
22 string(5) "91200"
23}*/
が、BC Math関数は標準ではインストールされないので、インストールする必要があります。
CentOSでyumでPHPがインストールされてるなら
bash
1# yum install php-bcmath
という感じです。レンタルサーバ等でインストールされてないならこの方法は諦めるしかありません。
その場合、
今回のケースだと、単純に10万倍したいだけなので文字列として操作しちゃうというのもありかもしれません。
流れとしてはこんな感じでしょうか。
- str_replace()で”万円”を削除する
- strpos()で小数点の位置を特定する。特定した位置と全体の文字数から、0埋めしないといけない桁数を計算する
- str_replaceで小数点を削除する
- 2で取得した数の0をsprintf()で0埋めするか、文字列として連結する。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/26 09:01