切捨てる場合はどうしたらいいでしょうか?
$A = 60.7313432836 => $A = 60.73
$B = 111199.46789 => $B = 111199.46
$C = 60.11 => $C = 60.11
$D = 8888881.999999999922 => $D = 8888881.99
今回は小数点第二で切捨てていますが
この小数点第二などは変換する
変数の引数に設定できるよう
お願い致します。
現在のサンプル
$AAA = (float)number_format($A, $n);
とやると
結果が60.73なのですが
$AAA = (float)number_format($B, $n);
とやると
結果が11になってしまいます。
このサンプルはダメなのですが書きかたは
同じ様に出来ませんか?
$A = 60.7313432836 ; $B = 111199.46789 ; $C = 60.11 ; $D = 8888881.999999999922 ; $n = 2 ; // 例1 $AAA = (float)floor($A * pow(10, $n)) / pow(10, $n) ; // 例2 $AAA = (float)preg_replace('/(\d*?\.)(\d{1,2})\d*/', '$1$2', $A) ;
こんな感じでどうでしょう。
pow(a, b) は a の b 乗 の意味ですので、$n = 2 のとき
100 をかけて floor を取ったあと 100 で割るという意味です。
$n = 3 なら 1000 になります。
このままで結構です。
納得です。
それともう一点なのですが
$A= 11で
実行すると
$A= 11.00となってしまうのですが
最後が.00の場合はその.00を
表示しないようにするには
計算が終わった後に自力で
やるしかないのでしょうか?
数学的にやろうとすると、当方の環境では
60.11 => 60.10 (丸め誤差のため)
8888881.999999999922 => 8888882 (有効桁オーバーフロー)
で上手くいかないので、文字列として扱うのを考えました。
(元の値が、計算結果なら無意味ですが)
$A = 60.7313432836 ; $aa = round2($A, 2); $E = 11; $ee1 = round2($E, 2); $ee2 = round2($E, 2, 1); function round2($a, $b, $f=0){ if (!ereg('/\./', $a)) { // 小数点以下がない場合 if ($f) return $a; $a .= '.'; } for ($i=0; $i<$b; $i++) $a .= '0'; // 正規表現のマッチ文字列をつくる $rexp = '/(\d*)\.'; for ($i=0; $i<$b; $i++) $rexp .= '(\d?)'; $rexp .= '(\d*)/'; preg_match($rexp, $a, $r); $ret = ''; for ($i=2; $i<=$b+1; $i++) $ret .= $r[$i]; if (!$f){ // 必要ならここでトレーディングゼロサプレス処理をする } $ret = $r[1] . '.' . $ret; return $ret; }
'11.00' と '11' では数学的意味合いが違うので、どちらも使えるようにスイッチをつけておきました。
上の結果は、$ee1 = '11.00', $ee2 = '11' となります。
元の値が、計算結果なら無意味ですがというのは
どういう意味でしょうか?
この例1のpowと10は必ず固定でも
問題ないでしょうか?