回答編集履歴
4
削除
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
修正
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
原因を追記
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
強調
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万倍したいだけなので文字列として操作しちゃうというのもありかもしれません。
|