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

回答編集履歴

2

指摘受けて追記します。

2019/09/05 08:13

投稿

mix-peach
mix-peach

スコア1910

answer CHANGED
@@ -70,9 +70,11 @@
70
70
  echo '--------------------------'.PHP_EOL;
71
71
 
72
72
  //整数値に変換して計算
73
+ //echo '■intval Tax'.PHP_EOL;
74
+ //$calctaxRate = intval((1 + $taxRate) * 100);
73
- echo '■intval Tax'.PHP_EOL;
75
+ echo '■round Tax'.PHP_EOL;
74
- $calctaxRate = intval((1 + $taxRate) * 100);
76
+ $calctaxRate = round((1 + $taxRate) * 100);
75
-
77
+
76
78
  echo 'tax = ';
77
79
  var_dump($calctaxRate);
78
80
 
@@ -84,4 +86,13 @@
84
86
 
85
87
  ```
86
88
 
87
- あと、ツッコミ忘れておりましたが、質問に提示されているコードの「税抜処理」の方、「切り上げ」と「切り捨て」で使っている関数が逆ですヨ^^;
89
+ あと、ツッコミ忘れておりましたが、質問に提示されているコードの「税抜処理」の方、「切り上げ」と「切り捨て」で使っている関数が逆ですヨ^^;
90
+
91
+
92
+ -------------
93
+
94
+ maisumakunさんよりご指摘をうけましたので、訂正追記を。
95
+
96
+ 整数値変換に```intval```を使うと、税率が「13%」になるかもしれない近い未来(なったら困りますね・・)に、誤差の原因となってしまうので、```round```での整数値変換の方が正確でした。
97
+
98
+ ※動作確認コードを修正しました。

1

動作確認コードの追加

2019/09/05 08:13

投稿

mix-peach
mix-peach

スコア1910

answer CHANGED
@@ -36,4 +36,52 @@
36
36
  ```
37
37
 
38
38
  今のままだと、```$calctaxRate```は少数値のままなので、
39
- 「税率側の少数値による誤差」が発生するリスクは含まれたままです。
39
+ 「税率側の少数値による誤差」が発生するリスクは含まれたままです。
40
+
41
+ ---
42
+
43
+ 追記です。
44
+
45
+ 私が使った動作確認のコードを載せてみますので、お手元で実行してみてください。
46
+ ちなみに動作確認は、5.3.18の環境はなかったので、5.3.3及び7.2.17で確認しました。両環境で同じ結果になります。
47
+
48
+ ```php
49
+ // 税率
50
+ $taxRate=0.1;
51
+
52
+ // 価格
53
+ $price=1000;
54
+
55
+ echo '<pre>';
56
+ echo 'price = '.$price.PHP_EOL;
57
+ echo '--------------------------'.PHP_EOL;
58
+
59
+ //少数値のまま計算
60
+ echo '■floatval Tax'.PHP_EOL;
61
+
62
+ $calctaxRate = (1 + $taxRate) * 100;
63
+ echo 'tax = ';
64
+ var_dump($calctaxRate);
65
+
66
+ //こっちは1101になる
67
+ echo 'ceil((price * tax) / 100) = ';
68
+ var_dump(ceil(($price*$calctaxRate)/100));
69
+
70
+ echo '--------------------------'.PHP_EOL;
71
+
72
+ //整数値に変換して計算
73
+ echo '■intval Tax'.PHP_EOL;
74
+ $calctaxRate = intval((1 + $taxRate) * 100);
75
+
76
+ echo 'tax = ';
77
+ var_dump($calctaxRate);
78
+
79
+ //こっちは1100になる
80
+ echo 'ceil((price * tax) / 100) = ';
81
+ var_dump(ceil(($price*$calctaxRate)/100));
82
+
83
+ echo '</pre>';
84
+
85
+ ```
86
+
87
+ あと、ツッコミ忘れておりましたが、質問に提示されているコードの「税抜処理」の方、「切り上げ」と「切り捨て」で使っている関数が逆ですヨ^^;