Как я могу усечь двойной только до двух десятичных знаков в Java? [дубликат]
этот вопрос уже есть ответ здесь:
например, у меня есть переменная 3.545555555, которую я хотел бы усечь только до 3.54.
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
Мне лично нравится эта версия, потому что она фактически выполняет округление численно, а не путем преобразования его в строку (или аналогичную), а затем форматирования.