Как я могу усечь двойной только до двух десятичных знаков в Java? [дубликат]


этот вопрос уже есть ответ здесь:

например, у меня есть переменная 3.545555555, которую я хотел бы усечь только до 3.54.

15 62

15 ответов:

если вы хотите, чтобы это для отображения целей, используйте java.text.DecimalFormat:

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

Если вам это нужно для расчетов, использовать java.lang.Math:

 Math.floor(value * 100) / 100;
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);

посмотреть RoundingMode и DecimalFormat.

бит старый форум, ни один из приведенных выше ответов не работал как для положительных, так и для отрицательных значений ( я имею в виду для расчета и просто для усечения без округления). Из как округлить число до n десятичных знаков в Java ссылке

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

обратите внимание, что a double является двоичной дробью и на самом деле не есть после запятой.

Если вам нужны десятичные знаки, используйте BigDecimal, которая имеет setScale() метод усечения, или использовать DecimalFormat и String.

если по какой-либо причине вы не хотите использовать BigDecimal вы можете отдать свой double до int укоротить ее.

если вы хотите усечь до те место:

  • просто приведен к int

до десятых место:

  • умножить на десять
  • литой int
  • бросил обратно в double
  • и разделить на десять.

Hundreths место

  • умножать и делить на 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 будет количество мест за те места, которые вы хотите пойти, так что 1 будет округляться до десятых место, 2 к соток и так далее (0 раундах те место и отрицательное-в десятки и т. д.)

может быть Math.floor(value * 100) / 100? Будьте осторожны, что значения, как 3.54 может быть не совсем представлен с double.

для выполнения задачи можно использовать объект класса NumberFormat.

// 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.545555555, чтобы получить 3.54. Попробуйте следующие Для этого:

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

    df.setRoundingMode(RoundingMode.FLOOR);

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

Это даст= 3.54!

формирование в виде строки и преобразование обратно в double я думаю, даст вам результат, который вы хотите.

двойное значение не будет круглым (), floor () или ceil ().

быстрое решение для этого может быть:

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

вы можете использовать sValue для отображения или newValue для расчета.

вот метод, который я использую:

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;

может быть следующим :

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

быстрая проверка заключается в использовании математики.метод пола. Я создал метод для проверки двойника для двух или менее десятичных знаков ниже:

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;
}
//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

ну это может быть немного неудобно, но я думаю, что это может решить вашу проблему:)

у меня есть немного измененная версия маникюр ' s.

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

это сработало для меня:

double input = 104.8695412  //For example

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

//result == 104.87

Мне лично нравится эта версия, потому что она фактически выполняет округление численно, а не путем преобразования его в строку (или аналогичную), а затем форматирования.