teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

削除

2016/06/26 08:27

投稿

tanat
tanat

スコア18778

answer CHANGED
@@ -53,5 +53,3 @@
53
53
  2. strpos()で小数点の位置を特定する。特定した位置と全体の文字数から、0埋めしないといけない桁数を計算する
54
54
  3. str_replaceで小数点を削除する
55
55
  4. 2で取得した数の0をsprintf()で0埋めするか、文字列として連結する。
56
-
57
- もしくは、

3

修正

2016/06/26 08:27

投稿

tanat
tanat

スコア18778

answer CHANGED
@@ -5,7 +5,7 @@
5
5
  var_dump($tmp);
6
6
  $rent_array[$j] = sprintf('%d',$tmp );
7
7
  ```
8
- とすると、sprintf()に渡される前に n.999999という感じになっているはずです。
8
+ とすると、1少なくなる数を計算した場合、sprintf()に渡される前に n.999999という感じになっているはずです。
9
9
 
10
10
  PHPに限らず、プログラム言語での小数計算は精度を指定しないと切り捨て問題が発生する可能性があります。
11
11
  [PHP 小数計算 誤差](https://www.google.co.jp/search?q=BC+Math&oq=BC+Math&aqs=chrome..69i57j69i60&sourceid=chrome&ie=UTF-8#q=php+%E5%B0%8F%E6%95%B0%E8%A8%88%E7%AE%97+%E8%AA%A4%E5%B7%AE)
@@ -52,4 +52,6 @@
52
52
  1. str_replace()で”万円”を削除する
53
53
  2. strpos()で小数点の位置を特定する。特定した位置と全体の文字数から、0埋めしないといけない桁数を計算する
54
54
  3. str_replaceで小数点を削除する
55
- 4. 2で取得した数の0をsprintf()で0埋めするか、文字列として連結する。
55
+ 4. 2で取得した数の0をsprintf()で0埋めするか、文字列として連結する。
56
+
57
+ もしくは、

2

原因を追記

2016/06/26 08:22

投稿

tanat
tanat

スコア18778

answer CHANGED
@@ -1,3 +1,12 @@
1
+ この現象はsprintfの仕様ではなく、小数を計算する際の誤差の問題です。
2
+ ```PHP
3
+ $rentamount = str_replace("万円", "",$url2->rent_amount);//賃料
4
+ $tmp = $rentamount * 10000;
5
+ var_dump($tmp);
6
+ $rent_array[$j] = sprintf('%d',$tmp );
7
+ ```
8
+ とすると、sprintf()に渡される前に n.999999という感じになっているはずです。
9
+
1
10
  PHPに限らず、プログラム言語での小数計算は精度を指定しないと切り捨て問題が発生する可能性があります。
2
11
  [PHP 小数計算 誤差](https://www.google.co.jp/search?q=BC+Math&oq=BC+Math&aqs=chrome..69i57j69i60&sourceid=chrome&ie=UTF-8#q=php+%E5%B0%8F%E6%95%B0%E8%A8%88%E7%AE%97+%E8%AA%A4%E5%B7%AE)
3
12
  PHPの場合、これを厳密に解決するには

1

強調

2016/06/26 08:19

投稿

tanat
tanat

スコア18778

answer CHANGED
@@ -34,7 +34,7 @@
34
34
  ```bash
35
35
  # yum install php-bcmath
36
36
  ```
37
- という感じです。レンタルサーバ等でインストールされてないならこの方法は諦めるしかありません。
37
+ という感じです。**レンタルサーバ等でインストールされてないならこの方法は諦めるしかありません。**
38
38
 
39
39
  その場合、
40
40
  今回のケースだと、単純に10万倍したいだけなので文字列として操作しちゃうというのもありかもしれません。