double
を常にint
に切り上げ、決して切り捨てないようにするにはどうすればよいですか。 Math.round(double)
は知っていますが、常に切り上げてほしいです。したがって、3.2
、4に丸められます。
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値を返します。特殊なケース:
Math.ceil(x)の値は、-Math.floor(-x)の値とまったく同じであることに注意してください。
パラメータ:
戻り値:
引数以上で数学的な整数に等しい最小の(負の無限大に最も近い)浮動小数点値。
簡単に言えば、
Math.ceil
は常にラウンドUPまたは上記のようにexcessになります。Math.round
は、小数に応じて切り上げまたは切り捨てられます。の例 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
それが役に立てば幸い。 (以前の回答から抽出された情報、私はそれをより明確にしたかっただけです)。
BigDecimal( "3.2" ).setScale( 0 , RoundingMode.CEILING )
4
BigDecimal
パフォーマンスではなく精度 が必要な場合は、 浮動小数点 テクノロジーを避けてください。つまり、float
、Float
、double
、Double
を避けることを意味します。正確にするには、 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でライブ実行 。
私の方法は比較的簡単です。あなたの役に立つことを願っています。
私の場合、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();
}
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;
}
}
よくやった ! ;)
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()
を使用する必要があります。これは、自分でできることの簡単な例にすぎません。