Наприклад, у мене є змінна 3,545555555, яку я хотів би скоротити лише до 3,54.
Наприклад, у мене є змінна 3,545555555, яку я хотів би скоротити лише до 3,54.
Відповіді:
Якщо ви хочете це зробити для демонстрації, використовуйте java.text.DecimalFormat
:
new DecimalFormat("#.##").format(dblVar);
Якщо вам це потрібно для розрахунків, використовуйте java.lang.Math
:
Math.floor(value * 100) / 100;
floor
для обрізання працює лише для позитивних значень.
RoundingMode.DOWN
як RoudingMode.FLOOR
завжди кружляє до негативної нескінченності.
DecimalFormat df = new DecimalFormat(fmt);
df.setRoundingMode(RoundingMode.DOWN);
s = df.format(d);
Перевірте наявність RoundingMode
і DecimalFormat
.
DOWN
насправді має ефект усічення як для позитивних, так і для негативних чисел. Як видно з таблиці прикладів у документі .
Трохи старий форум, жодна з наведених відповідей не працювала як для позитивних, так і для негативних значень (я маю на увазі для обчислення і просто для обрізання без округлення). З Хау округлити число до п знаків після коми в 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
є двійковим дробом і насправді не має десяткових знаків.
Якщо вам потрібні десяткові знаки, використовуйте a BigDecimal
, який має setScale()
метод усічення, або використовуйте, DecimalFormat
щоб отримати a String
.
Якщо з якихось причин ви не хочете використовувати a, BigDecimal
ви можете double
передати його на, int
щоб усічити його.
Якщо ви хочете скоротити місце до Онесів :
int
До десятих місць:
int
double
Місце хандретів
Приклад:
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 раундів на тих , місця і негативною до десятків тощо)
unroundedNumber
вони досить великі. Це може працювати для прикладу у питанні, але загальне рішення має працювати для будь-якого double
.
Форматування як рядок і перетворення назад у подвійне, я думаю, це дасть вам результат, який ви хочете.
Подвійне значення не буде круглим (), підлоговим () або стельовим ().
Швидким виправленням цього може бути:
String sValue = (String) String.format("%.2f", oldValue);
Double newValue = Double.parseDouble(sValue);
Ви можете використовувати sValue для відображення або newValue для розрахунку.
Ви можете використовувати об’єкт ClassFormat 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
Ось метод, який я використовую:
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));
}
Швидка перевірка полягає у використанні методу 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;
}
У мене є трохи модифікована версія Мані .
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
Мені особисто подобається ця версія, оскільки вона насправді виконує округлення чисельно, а не перетворюючи її на Рядок (або подібну), а потім форматуючи.
//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
ну це може бути трохи незручно, але я думаю, що це може вирішити вашу проблему :)