web-dev-qa-db-ja.com

常に倍を切り上げる

doubleを常にintに切り上げ、決して切り捨てないようにするにはどうすればよいですか。 Math.round(double)は知っていますが、常に切り上げてほしいです。したがって、3.2、4に丸められます。

24
sparklyllama

Math.ceil()メソッドを使用できます。

JavaDocリンクを参照してください: https://docs.Oracle.com/javase/10/docs/api/Java/lang/Math.html#ceil(double)

ドキュメントから:

ceil

public static double ceil(double a)

引数以上で数学的な整数に等しい最小の(負の無限大に最も近い)double値を返します。特殊なケース:

  • 引数の値が既に数学的な整数に等しい場合、結果は引数と同じになります。
  • 引数がNaNまたは無限大または正のゼロまたは負のゼロの場合、結果は引数と同じになります。
  • 引数の値がゼロより小さく-1.0より大きい場合、結果は負のゼロになります。

Math.ceil(x)の値は、-Math.floor(-x)の値とまったく同じであることに注意してください。

パラメータ:

  • a-値。

戻り値:

引数以上で数学的な整数に等しい最小の(負の無限大に最も近い)浮動小数点値。

36
tabz100

簡単に言えば、

  • Math.ceilは常にラウンドUPまたは上記のようにexcessになります。
  • Math.roundは、小数に応じて切り上げまたは切り捨てられます。
    • 小数点が5以上の場合、切り上げ
      • 10進数=> 5(1,5 = 2)
    • 小数が5未満の場合、切り捨て
      • 10進数<5(1,45 = 1)

の例 Math.ceilおよびMath.round

以下のコードは戻ります:
コスト、Ceil 2.2なし、Ceil 3(int)、3.0(double)あり。丸める場合:2

    int m2 = 2200;
    double rate = 1000.0;

    int costceil = (int)Math.ceil(m2/rate);
    double costdouble = m2/rate;
    double costdoubleceil = Math.ceil(m2/rate);
    int costrounded = (int)Math.round(m2/rate);
    System.out.println("Cost, without Ceil "+costdouble+" and with Ceil "+
            costceil+"(int), "+costdoubleceil+"(double). If we round it: "+costrounded);

M2の値を2499などに変更すると、結果は次のようになります:コスト、Ceil 2.499なし、Ceil 3(int)、3.0(double)。丸める場合:2
m2の値を255などに変更すると、結果は次のようになります。
コスト、Ceil 2.55なし、Ceil 3(int)、3.0(double)あり。丸める場合:3

それが役に立てば幸い。 (以前の回答から抽出された情報、私はそれをより明確にしたかっただけです)。

8
maral04

tl; dr

BigDecimal( "3.2" ).setScale( 0 , RoundingMode.CEILING )

4

BigDecimal

パフォーマンスではなく精度 が必要な場合は、 浮動小数点 テクノロジーを避けてください。つまり、floatFloatdoubleDoubleを避けることを意味します。正確にするには、 BigDecimal classを使用します。

BigDecimalでは、 スケールを設定 、小数点以下の桁数。小数が必要ない場合は、スケールをゼロに設定します。 丸めモード を指定します。常に端数を切り上げるには、 RoundingMode.CEILING 、次のように文書化:

正の無限大に向かって丸める丸めモード。結果が正の場合、RoundingMode.UPと同様に動作します。負の場合、RoundingMode.DOWNのように動作します。この丸めモードでは、計算値が減少しないことに注意してください。たとえば、1.1は2になり、3.2は4になります。

BigDecimal bd = new BigDecimal( "3.2" ) ;
BigDecimal bdRounded = bd.setScale( 0 , RoundingMode.CEILING ) ;
String output = bdRounded.toString() ; 
System.out.println( "bdRounded.toString(): " + bdRounded ) ;  // 4

4

こちらをご覧ください コードはIdeOne.comでライブ実行

1
Basil Bourque

私の方法は比較的簡単です。あなたの役に立つことを願っています。

私の場合、3つのアイテムのみを保持できるオブジェクトの行があり、アイテムに対応するために行数を調整する必要があります。

だから私はいくつかのDouble numberOfRowsを持っているので、numberOfRows.intValue()を使用してnumberOfRowsのint値を取得します。

取得するint値がnumberOfRowsより小さい場合、numberOfRowsに1を追加して切り上げます。それ以外の場合、numberOfRows.intValue()から取得する値が必要な答えです。

私はこのシンプルなforループを書いてテストしました:

    for(int numberOfItems = 0; numberOfItems < 16; numberOfItems++) {
        Double numberOfRows = numberOfItems / 3.0;

        System.out.println("Number of rows are: " + numberOfRows);
        System.out.println("Number of items are: " + numberOfItems);
        if(numberOfRows.intValue() < numberOfRows) {
            System.out.println("int number of rows are: " + (numberOfRows.intValue() + 1));
        }
        else {
            System.out.println("int value of rows are: " + numberOfRows.intValue());
        }
        System.out.println();
        System.out.println();
    }
0
Tunji_D
private int roundUP(double d){
    double dAbs = Math.abs(d);
    int i = (int) dAbs;
    double result = dAbs - (double) i;
    if(result==0.0){ 
        return (int) d;
    }else{
        return (int) d<0 ? -(i+1) : i+1;          
    }
}

よくやった ! ;)

0
Lostkiefer

Math.ceil()を使用しない短い例.

_public double roundUp(double d){
    return d > (int)d ? (int)d + 1 : d;
}
_

説明:より大きい戻り値が切り捨てられた引数+ 1(切り上げを意味する)の場合、タイプキャストを使用してオペランドを切り捨てられたオペランドと比較します。

擬似コードの例

_double x = 3.01
int roundDown = (int)x   // roundDown = 3
if(x > roundDown)        // 3.01 > 3
    return roundDown + 1 // return 3.0 + 1.0 = 4.0
else
    return x             // x equals roundDown
_

とにかくMath.ceil()を使用する必要があります。これは、自分でできることの簡単な例にすぎません。

0
trinity420