Javaでdoubleを小数点以下2桁に切り捨てるにはどうすればよいですか?


回答:


144

表示目的で使用する場合は、次を使用しますjava.text.DecimalFormat

 new DecimalFormat("#.##").format(dblVar);

計算に必要な場合は、次を使用しますjava.lang.Math

 Math.floor(value * 100) / 100;

50
これは、3.545555555から3.54に切り捨てられ、3.55に丸められます。DecimalFormat.setRoundingMode()をRoundingMode.FLOORに設定する必要があります。
クリスチャンガルシア

9
これは私には機能しませんMath.floor(9.62 * 100)/ 100は9.61
Mani

4
floor切り捨てに使用すると、正の値でのみ機能します。
開発、2015年

3
@ChristianGarcía切り捨てはRoundingMode.DOWNRoudingMode.FLOOR常に負の無限大に丸めるように適切に行われます。
Devの

46
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);

利用可能RoundingModeとを確認してくださいDecimalFormat


丸めではなく切り捨てを要求する質問には触れません。
バジルブルク2015

8
@BasilBourque RoundingMode.DOWNは切り捨てです。床機能を誤って推奨する他の回答(床は正の数のみを切り捨てる)と比較すると、これは正の値と負の値の両方で正しく機能します。
Dev

1
@Dev修正しました。DOWN実際、正の数と負の数の両方で切り捨ての効果があることがわかります。ドキュメントの例の表にあるとおり。
バジルブルク

23

ビットオールドフォーラム、上記の答えのいずれも正と負の両方の値で機能しませんでした(つまり、計算と丸めなしで切り捨てることを意味します)。Javaでどのように番号を丸めるnは小数点以下のリンク

private static BigDecimal truncateDecimal(double x,int numberofDecimals)
{
    if ( x > 0) {
        return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_FLOOR);
    } else {
        return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_CEILING);
    }
}

この方法は私にとってはうまくいきました。

System.out.println(truncateDecimal(0, 2));
    System.out.println(truncateDecimal(9.62, 2));
    System.out.println(truncateDecimal(9.621, 2));
    System.out.println(truncateDecimal(9.629, 2));
    System.out.println(truncateDecimal(9.625, 2));
    System.out.println(truncateDecimal(9.999, 2));
    System.out.println(truncateDecimal(-9.999, 2));
    System.out.println(truncateDecimal(-9.0, 2));

結果 :

0.00
9.62
9.62
9.62
9.62
9.99
-9.99
-9.00

これは、より多くのテストケースに対応できる拡張可能な答えです
diego matos-keke

新しいBigDecimal(x).setScale(numberofDecimals、RoundingMode.DOWN).doubleValue();を返します。
Shimon Doodkin

切り捨てはあなたが意図したもののようです:docs.oracle.com/javase/7/docs/api/java/math/RoundingMode.html
Shimon Doodkin

9

最初に、a doubleは2進数であり、実際に小数点以下の桁数がないことに注意してください。

小数点以下の桁数が必要な場合BigDecimalは、setScale()切り捨てを行うメソッドを持つを使用DecimalFormatするか、を使用してを取得しStringます。


7

何らかの理由で、あなたが使用しない、場合BigDecimal、あなたはあなたをキャストすることができますdoubleint、それを切り捨てること。

Onesの場所に切り詰める場合:

  • 単にキャストする int

十の場所:

  • 10を掛ける
  • キャストする int
  • にキャストバックする double
  • 10で割ります。

ヶ所

  • 100で乗算および除算するなど。

例:

static double truncateTo( double unroundedNumber, int decimalPlaces ){
    int truncatedNumberInt = (int)( unroundedNumber * Math.pow( 10, decimalPlaces ) );
    double truncatedNumber = (double)( truncatedNumberInt / Math.pow( 10, decimalPlaces ) );
    return truncatedNumber;
}

この例でdecimalPlacesは、行きたい場所をPASTした場所の数になるので、1は10の位に、2は100の位に丸めます。位に丸めます(0は1の位に丸め、負の1は10の位に丸めます)。、など)


3
これはひどい一般的な解決策です。乗算とキャストの両方でデータが破棄され、結果がunroundedNumber十分に大きければ実質的に乱数になります。問題の例では機能する可能性がありますが、一般的な解決策はどのでも機能するはずdoubleです。
blm 2015年

4

文字列としてフォーマットし、doubleに変換すると、希望する結果が得られると思います。

double値は、round()、floor()、ceil()にはなりません。

それの簡単な修正は次のとおりです:

 String sValue = (String) String.format("%.2f", oldValue);
 Double newValue = Double.parseDouble(sValue);

表示にはsValueを、計算にはnewValueを使用できます。


1
それは私に最も近い値に丸めます。たとえば、0.018は0.02に変換されます。
カランパテル

3

たぶんMath.floor(value * 100) / 100?のような値3.54は、で正確に表されない場合があることに注意してくださいdouble


3

NumberFormat Classオブジェクトを使用して、タスクを実行できます。

// Creating number format object to set 2 places after decimal point
NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(2);            
nf.setGroupingUsed(false);

System.out.println(nf.format(precision));// Assuming precision is a double type variable

3

3.54を取得するには3.545555555。これのために以下を試してください:

    DecimalFormat df = new DecimalFormat("#.##");

    df.setRoundingMode(RoundingMode.FLOOR);

    double result = new Double(df.format(3.545555555);

これは= 3.54を与えます!


1

これが私が使う方法です:

double a=3.545555555; // just assigning your decimal to a variable
a=a*100;              // this sets a to 354.555555
a=Math.floor(a);      // this sets a to 354
a=a/100;              // this sets a to 3.54 and thus removing all your 5's

これも行うことができます:

a=Math.floor(a*100) / 100;

0

多分続く:

double roundTwoDecimals(double d) { 
      DecimalFormat twoDForm = new DecimalFormat("#.##"); 
      return Double.valueOf(twoDForm.format(d));
}  

他の答えを見てください。答えが浮動小数点で表される場合、確実にそれを行うことはできません。
ローンの侯爵

0

簡単なチェックは、Math.floorメソッドを使用することです。小数点以下2桁以下のdoubleをチェックするメソッドを作成しました。

public boolean checkTwoDecimalPlaces(double valueToCheck) {

    // Get two decimal value of input valueToCheck 
    double twoDecimalValue = Math.floor(valueToCheck * 100) / 100;

    // Return true if the twoDecimalValue is the same as valueToCheck else return false
    return twoDecimalValue == valueToCheck;
}

-1

Maniのわずかに変更されたバージョンがあります。

private static BigDecimal truncateDecimal(final double x, final int numberofDecimals) {
    return new BigDecimal(String.valueOf(x)).setScale(numberofDecimals, BigDecimal.ROUND_DOWN);
}

public static void main(String[] args) {
    System.out.println(truncateDecimal(0, 2));
    System.out.println(truncateDecimal(9.62, 2));
    System.out.println(truncateDecimal(9.621, 2));
    System.out.println(truncateDecimal(9.629, 2));
    System.out.println(truncateDecimal(9.625, 2));
    System.out.println(truncateDecimal(9.999, 2));
    System.out.println(truncateDecimal(3.545555555, 2));

    System.out.println(truncateDecimal(9.0, 2));
    System.out.println(truncateDecimal(-9.62, 2));
    System.out.println(truncateDecimal(-9.621, 2));
    System.out.println(truncateDecimal(-9.629, 2));
    System.out.println(truncateDecimal(-9.625, 2));
    System.out.println(truncateDecimal(-9.999, 2));
    System.out.println(truncateDecimal(-9.0, 2));
    System.out.println(truncateDecimal(-3.545555555, 2));

}

出力:

0.00
9.62
9.62
9.62
9.62
9.99
9.00
3.54
-9.62
-9.62
-9.62
-9.62
-9.99
-9.00
-3.54

-2

これは私のために働きました:

double input = 104.8695412  //For example

long roundedInt = Math.round(input * 100);
double result = (double) roundedInt/100;

//result == 104.87

私がこのバージョンを個人的に気に入っているのは、文字列(または類似のもの)に変換してからフォーマットするのではなく、実際に数値的に丸めを実行するためです。


1
元の質問は、丸めではなく切り捨てに関するものです。また、doubleが十分に大きい場合、doubleをlongに変換してもまったく機能しません。
blm 2015年

-2
//if double_v is 3.545555555
String string_v= String.valueOf(double_v);
int pointer_pos = average.indexOf('.');//we find the position of '.'
string_v.substring(0, pointer_pos+2));// in this way we get the double with only 2 decimal in string form
double_v = Double.valueOf(string_v);//well this is the final result

これは少し扱いに​​くいかもしれませんが、問題を解決できると思います:)


このコードは仕事を成し遂げますが、エレガントではなく、パフォーマンスが低下します。学校のプロジェクトでは問題ないかもしれませんが、後で頭痛がしたくない場合を除いて、誰かがあらゆるシステムの生産で使用するソリューションは間違いなくありません。
cbaldan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.