Java с плавающей точкой с 123.129456 по 123.12 без округления - PullRequest
5 голосов
/ 19 февраля 2011

Как вырезать float примитив в java до два десятичных знака без округления?:

123.99999 to 123.99
-8.022222 to -8.02

Не должно быть округления, просто вырезатьдесятичных знаков и оставить два.

Второй пункт - как вы проверяете или считаете, сколько десятичных знаков после точки?:

123.99 will give true or 2
123.999 will give false or 3

ОБНОВЛЕНИЕ

числа являются входными данными String, поэтому я думаю, что я пойду с этим как предложено;и я буду просто иметь блок int try / catch для любых исключений.Любые предложения о том, как сделать эту работу более разумным, приветствуются:

public static float onlyTwoDecimalPlaces(String number) {
    StringBuilder sbFloat = new StringBuilder(number);
    int start = sbFloat.indexOf(".");
    if (start < 0) {
        return new Float(sbFloat.toString());
    }
    int end = start+3;
    if((end)>(sbFloat.length()-1)) end = sbFloat.length();

    String twoPlaces = sbFloat.substring(start, end);
    sbFloat.replace(start, sbFloat.length(), twoPlaces);
    return new Float(sbFloat.toString());
}

Ответы [ 5 ]

8 голосов
/ 21 ноября 2012

Когда вы используете DecimalFormat, помните о том, что во многих языках используется "," вместо "." для плавания. Таким образом, пока вы отформатируете число с плавающей запятой на «0,00», оно станет «0,00» в некоторых регионах (например, в немецком и польском). Это вызовет NullPointerException, пока вы будете использовать этот новый форматированный float в приложениях для Android. Итак, что я сделал для того, чтобы вырезать, а не округлить, это привести его к int после умножения на 100, а затем переделать его обратно, чтобы плавать и разделить на 100 Это строка:

myFloat = (float)((int)( myFloat *100f))/100f;

Вы можете попробовать это с журналом:

float myFloat = 12.349;
myFloat = (float)((int)( myFloat *100f ))/100f;
Log.d(TAG, " myFloat = "+ myFloat);       //you will get myFloat = 12.34

Это сократит myFloat на два знака после десятичной точки до формата ("0,00") он не будет округлять его, как эта линия (myFloat = Math.round(myFloat *100.0)/100.0;), он просто обрежет его.

6 голосов
/ 19 февраля 2011

Имейте в виду, что с плавающей запятой являются значениями с плавающей запятой .Таким образом, для определенного числа может даже не быть точного двух десятичного представления.

Сказав это, вы можете попробовать что-то вроде:

float f = -8.022222f;
BigDecimal bd = new BigDecimal(f);
BigDecimal res = bd.setScale(2, RoundingMode.HALF_UP);
f = res.floatValue();
System.out.println(f);

Возможно, вам понадобитсяиспользовать другой RoundingMode, хотя.Зависит от того, что вы хотите.

4 голосов
/ 19 февраля 2011

Прежде всего, нет никакой гарантии, что только потому, что число с плавающей точкой может точно представлять a.bcde, он гарантированно сможет точно представлять a.bc.

Так что, если вам нужна только часть печати, как насчет того, чтобы сделать это с помощью некоторых манипуляций со строками? Найдите десятичную точку с помощью indexOf и извлеките часть с двумя десятичными знаками, используя substring.

2 голосов
/ 11 мая 2011

Простой способ использовать DecimalFormat:

DecimalFormat df = new DecimalFormat("0.00");
float f = -8.0222222f;
f = Float.parseFloat(df.format(f));
System.out.println(f);
1 голос
/ 22 апреля 2014

Пожалуйста, попробуйте это, это работает для вас.

double d = 16.66667;
DecimalFormat decimalFormat= new DecimalFormat("#.##");
decimalFormat.setRoundingMode(RoundingMode.FLOOR);
System.out.println("Result :"+decimalFormat.format(d));
...