回答編集履歴
1
追記
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が負の場合も考慮すると、正負の場合分けが必要そうです。
|