回答編集履歴

2

指摘受けて追記します。

2019/09/05 08:13

投稿

mix-peach
mix-peach

スコア1910

test CHANGED
@@ -142,11 +142,15 @@
142
142
 
143
143
  //整数値に変換して計算
144
144
 
145
- echo '■intval Tax'.PHP_EOL;
145
+ //echo '■intval Tax'.PHP_EOL;
146
146
 
147
- $calctaxRate = intval((1 + $taxRate) * 100);
147
+ //$calctaxRate = intval((1 + $taxRate) * 100);
148
148
 
149
-
149
+ echo '■round Tax'.PHP_EOL;
150
+
151
+ $calctaxRate = round((1 + $taxRate) * 100);
152
+
153
+
150
154
 
151
155
  echo 'tax = ';
152
156
 
@@ -171,3 +175,21 @@
171
175
 
172
176
 
173
177
  あと、ツッコミ忘れておりましたが、質問に提示されているコードの「税抜処理」の方、「切り上げ」と「切り捨て」で使っている関数が逆ですヨ^^;
178
+
179
+
180
+
181
+
182
+
183
+ -------------
184
+
185
+
186
+
187
+ maisumakunさんよりご指摘をうけましたので、訂正追記を。
188
+
189
+
190
+
191
+ 整数値変換に```intval```を使うと、税率が「13%」になるかもしれない近い未来(なったら困りますね・・)に、誤差の原因となってしまうので、```round```での整数値変換の方が正確でした。
192
+
193
+
194
+
195
+ ※動作確認コードを修正しました。

1

動作確認コードの追加

2019/09/05 08:13

投稿

mix-peach
mix-peach

スコア1910

test CHANGED
@@ -75,3 +75,99 @@
75
75
  今のままだと、```$calctaxRate```は少数値のままなので、
76
76
 
77
77
  「税率側の少数値による誤差」が発生するリスクは含まれたままです。
78
+
79
+
80
+
81
+ ---
82
+
83
+
84
+
85
+ 追記です。
86
+
87
+
88
+
89
+ 私が使った動作確認のコードを載せてみますので、お手元で実行してみてください。
90
+
91
+ ちなみに動作確認は、5.3.18の環境はなかったので、5.3.3及び7.2.17で確認しました。両環境で同じ結果になります。
92
+
93
+
94
+
95
+ ```php
96
+
97
+ // 税率
98
+
99
+ $taxRate=0.1;
100
+
101
+
102
+
103
+ // 価格
104
+
105
+ $price=1000;
106
+
107
+
108
+
109
+ echo '<pre>';
110
+
111
+ echo 'price = '.$price.PHP_EOL;
112
+
113
+ echo '--------------------------'.PHP_EOL;
114
+
115
+
116
+
117
+ //少数値のまま計算
118
+
119
+ echo '■floatval Tax'.PHP_EOL;
120
+
121
+
122
+
123
+ $calctaxRate = (1 + $taxRate) * 100;
124
+
125
+ echo 'tax = ';
126
+
127
+ var_dump($calctaxRate);
128
+
129
+
130
+
131
+ //こっちは1101になる
132
+
133
+ echo 'ceil((price * tax) / 100) = ';
134
+
135
+ var_dump(ceil(($price*$calctaxRate)/100));
136
+
137
+
138
+
139
+ echo '--------------------------'.PHP_EOL;
140
+
141
+
142
+
143
+ //整数値に変換して計算
144
+
145
+ echo '■intval Tax'.PHP_EOL;
146
+
147
+ $calctaxRate = intval((1 + $taxRate) * 100);
148
+
149
+
150
+
151
+ echo 'tax = ';
152
+
153
+ var_dump($calctaxRate);
154
+
155
+
156
+
157
+ //こっちは1100になる
158
+
159
+ echo 'ceil((price * tax) / 100) = ';
160
+
161
+ var_dump(ceil(($price*$calctaxRate)/100));
162
+
163
+
164
+
165
+ echo '</pre>';
166
+
167
+
168
+
169
+ ```
170
+
171
+
172
+
173
+ あと、ツッコミ忘れておりましたが、質問に提示されているコードの「税抜処理」の方、「切り上げ」と「切り捨て」で使っている関数が逆ですヨ^^;