2016-05-12 3 views
1

変数の最初の小数点を常に切り上げたいとします。例:常に最初の小数点を切り上げます

9.66 goes to 9.7 
9.55 goes to 9.6 
9.51 goes to 9.6 
9.00000001 goes to 9.1 

どうすればよいですか?オプションの精度および丸型引数を持つ

+0

[丸め](http://stackoverflow.com/q/12277945/3919155)に関する同様の質問です。 – jotik

答えて

2

使用 round()、例えば:

round($value, 1, PHP_ROUND_HALF_UP) 

round()にオプションの第二引数は精度引数であり、それは丸する桁数を指定します。 3番目のオプションの引数は、丸めモードを指定します。詳細は、 PHP manual for roundを参照してください。 round()を使用

(例えば9.00001が9.1に丸められていない)PHP_ROUND_HALF_UPを用いた場合でも、必ずしも円形アップありません。代わりに、乗算、ceil()と分裂を使用するように試みることができる:

ceil($value * 10.0)/10.0 

これらは浮動小数点値なので、あなたが正確な結果を得られない可能性があります。

+0

私は既にroundを使用していますが、3番目(またはそれ以上)の小数点以下が5になると常に切り捨てられます。また、precision引数も調べましたが、有用なものは見つかりませんでした。 –

+0

私はそれが指定通りに正確に動作しないと思います。 9.00000001 => '.round(9.00000001,1、PHP_ROUND_HALF_UP).PHP_EOL; '私の出力は9です。 –

+0

[この質問](http://stackoverflow.com/q/36324171/3919155)お手伝いをしていますが、私は自分の答えを編集して、問題に対する簡単な代替ソリューションを提供しました。 – jotik

0

カスタムceil()関数が必要です。デフォルト関数またはラウンドでは、あなたの要件を満たすことができません。

1

私はPHPプログラマーではないので、「ステップ」で答えなければなりません。あなたが持っている問題は、ちょうど1つの10進数の数字を持っている場合です。 (例えば9.5)

ここであなたがそれを行うことができる方法です:

  1. 乗算あなたの数は10
  2. によってそれが整数だ場合、他の元の番号は(つまり、エッジケースです)、として継続返します
  3. 追加0.5
  4. 通常の方法で整数に丸めます(つまり「a.5」は切り上げます)。
  5. 整数をテストするために、PHPのドキュメントの周り機能 bool is_int (mixed $var)を明らかスニッフィング、ステップ(2)10.

によって結果を割り

  • 1

    私はカップルのテストを行い、テストケース

    <?php 
    
    echo '9.66 (expected 9.7) => '.myRound(9.66).PHP_EOL; 
    echo '9.55 (expected 9.6) => '.myRound(9.55).PHP_EOL; 
    echo '9.51 (expected 9.6) => '.myRound(9.51).PHP_EOL; 
    echo '9.00000001 (expected 9.1) => '.myRound(9.00000001).PHP_EOL; 
    echo '9.9 (expected ??) => '.myRound(9.9).PHP_EOL; 
    echo '9.91 (expected ??) => '.myRound(9.91).PHP_EOL; 
    
    function myRound($value) 
    { 
        return ceil($value*10)/10; 
    } 
    
    +0

    ここでの質問は、9.91の結果はどうなるでしょうか?私はそれが10であるべきだと思う。 –

    0

    使用これで、次の答えを示唆:online test

    あなたがこのテクニックを使用することができます。与えられた数字/文字列を爆発させ、.の次の値/数字である数字を取得します。これを取得した後、その値をインクリメントして、値が9より大きいかどうかを確認する必要があります。また、それを除算して、キャリーをメイン番号の最初の部分に追加する必要があります。

    $var = '9.96'; 
    $ar = explode(".", $var); 
    
    $nxt = substr($ar[1], 0, 1) + 1; 
    
    if($nxt > 9){ 
        $tmp = (string) $nxt; 
        $num = floatval(($ar[0] + $tmp[0]).".".$tmp[1]); 
    } 
    else 
        $num = floatval($ar[0].".".$nxt); 
    
    var_dump($num); // float(10) 
    
    関連する問題