回答編集履歴

1

追記

2015/06/11 15:33

投稿

otn
otn

スコア84423

test CHANGED
@@ -9,3 +9,37 @@
9
9
 
10
10
 
11
11
  正確には、PHP_ROUND_HALF_UP以外は四捨五入じゃ無いので、関数の説明に四捨五入と書けず、「まるめ」と表現したのでしょう。しかし、切り捨て、切り上げも「まるめ」の一種なので、その点でおかしくなっています。
12
+
13
+
14
+
15
+ 追記:
16
+
17
+ floor()やceil()に何故桁数指定機能が無いのかを考えてみると、単純に100をかけて切り捨てて100で割る方法だと、値によっては、10進数に直してから第3位を切り捨てるのと比べると差が出るケースもあったりするので、避けてるのかなと言う気がします。いったん10進数に変換してから(つまり文字列に変換してから)処理した方が正確だと思います。
18
+
19
+
20
+
21
+ 実際、試してみると差が出るケースがありました。
22
+
23
+ PHP 5.3.3 (cli) (built: Oct 30 2014 20:12:53)
24
+
25
+ ```lang-PHP
26
+
27
+ <?php
28
+
29
+ $a=10+0.001*40;
30
+
31
+ var_dump($a); //=> float(10.04)
32
+
33
+ var_dump(floor($a*100)/100); //=> float(10.03)
34
+
35
+ ```
36
+
37
+ いったん文字列に直して、小数点以下3桁目以降を削除するという方法がいいようです。
38
+
39
+ ```lang-PHP
40
+
41
+ var_dump(floor($a)+substr(sprintf("%5.3f",$a-floor($a)),0,4));
42
+
43
+ ```
44
+
45
+ とか。$aが負の場合も考慮すると、正負の場合分けが必要そうです。