Например, у меня есть переменная 3.545555555, которую я бы хотел усечь до 3,54.
Как я могу усечь двойную до двух десятичных знаков в Java?
Ответ 1
Если вы хотите использовать это для отображения, используйте java.text.DecimalFormat
:
new DecimalFormat("#.##").format(dblVar);
Если вам это нужно для расчетов, используйте java.lang.Math
:
Math.floor(value * 100) / 100;
Ответ 2
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);
Отметьте наличие RoundingMode
и DecimalFormat
.
Ответ 3
Bit Old Forum. Ни один из вышеперечисленных ответов не работал как для положительных, так и для отрицательных значений (я имею в виду для вычисления и просто для усечения без округления). Из Как округлить число до десяти знаков после запятой в 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
Ответ 4
Обратите внимание, что a double
является двоичной дробью и на самом деле не имеет десятичных знаков.
Если вам нужны десятичные разряды, используйте BigDecimal
, у которого есть метод setScale()
для усечения, или используйте DecimalFormat
для получения String
.
Ответ 5
Если по какой-либо причине вы не хотите использовать BigDecimal
, вы можете наложить double
на int
, чтобы усечь его.
Если вы хотите усечь место Ones:
- просто добавьте к
int
В десятое место:
- умножить на десять
- на
int
- вернитесь к
double
- и разделите на десять.
Место Хундрета
- умножить и разделить на 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 будет округлен до десятых, от 2 до сотых и т.д. (0 раундов до одного места, и отрицательный - десятки и т.д.)
Ответ 6
Может быть Math.floor(value * 100) / 100
? Помните, что значения, подобные 3.54
, могут быть не точно представлены с помощью double
.
Ответ 7
Вы можете использовать объект 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
Ответ 8
3.545555555, чтобы получить 3.54. Попробуйте следующее:
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.FLOOR);
double result = new Double(df.format(3.545555555);
Это даст = 3.54!
Ответ 9
Вот метод, который я использую:
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;
Ответ 10
Формирование в виде строки и преобразование обратно в двойное я думаю, даст вам результат, который вы хотите.
Двойное значение не будет round(), floor() или ceil().
Быстрое исправление для него может быть:
String sValue = (String) String.format("%.2f", oldValue);
Double newValue = Double.parseDouble(sValue);
Вы можете использовать sValue для целей показа или вычисления newValue.
Ответ 11
Возможно следующее:
double roundTwoDecimals(double d) {
DecimalFormat twoDForm = new DecimalFormat("#.##");
return Double.valueOf(twoDForm.format(d));
}
Ответ 12
Быстрая проверка заключается в использовании метода Math.floor. Я создал метод проверки двойника для двух или менее десятичных знаков ниже:
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;
}
Ответ 13
У меня есть слегка измененная версия 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
Ответ 14
Это сработало для меня:
double input = 104.8695412 //For example
long roundedInt = Math.round(input * 100);
double result = (double) roundedInt/100;
//result == 104.87
Мне лично нравится эта версия, потому что она фактически выполняет округление численно, а не путем преобразования ее в String (или аналогичную), а затем форматирует ее.
Ответ 15
//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
Хорошо, это может быть немного неудобно, но я думаю, что он может решить вашу проблему:)