PHPで自分で指定してある小数点以上だったら

切捨てる場合はどうしたらいいでしょうか?
$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になってしまいます。
このサンプルはダメなのですが書きかたは
同じ様に出来ませんか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2007/06/20 12:25:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:GEN111 No.1

回答回数472ベストアンサー獲得回数58

ポイント27pt
$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) ;

こんな感じでどうでしょう。

id:hopefully

この例1のpowと10は必ず固定でも

問題ないでしょうか?

2007/06/13 13:35:38
id:GEN111 No.2

回答回数472ベストアンサー獲得回数58

ポイント27pt

pow(a, b) は a の b 乗 の意味ですので、$n = 2 のとき

100 をかけて floor を取ったあと 100 で割るという意味です。

$n = 3 なら 1000 になります。

このままで結構です。

id:hopefully

納得です。

それともう一点なのですが

$A= 11で

実行すると

$A= 11.00となってしまうのですが

最後が.00の場合はその.00を

表示しないようにするには

計算が終わった後に自力で

やるしかないのでしょうか?

2007/06/13 13:56:21
id:tezcello No.3

回答回数460ベストアンサー獲得回数69

ポイント26pt

数学的にやろうとすると、当方の環境では

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' となります。

id:hopefully

元の値が、計算結果なら無意味ですがというのは

どういう意味でしょうか?

2007/06/13 19:54:06
  • id:tezcello
    > 元の値が...
    元の値が文字列として与えられていないと、どこかで十進に変換する事になり、その際に予想と違う結果になるからです。

    例えば、0.11は内部では
    0.0001 1100 0010 1000 1111 0101 1100 0010 1000 〜 です。
    これを十進にすると 0.10999999998603(計算が合っていれば)となってしまいます。

    計算結果を単に表示するだけ(しかも最下位の値は誤差を含む)というのが許容出来れば問題ありません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません