Использование Math.round для округления до одного десятичного знака?

У меня эти две переменные

double num = 540.512
double sum = 1978.8

Тогда я сделал это выражение

double total = Math.round((num/ sum * 100) * 10) / 10;

но я получаю 27.0.

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

Ответ 1

Полезный метод, который я создал некоторое время назад...

private static double round (double value, int precision) {
    int scale = (int) Math.pow(10, precision);
    return (double) Math.round(value * scale) / scale;
}

Ответ 2

Метод Math.round возвращает long (или int, если вы передаете float), и Java виновным является целочисленное деление. Верните его в double или используйте литерал double при делении на 10. Или:

double total = (double) Math.round((num / sum * 100) * 10) / 10;

или

double total = Math.round((num / sum * 100) * 10) / 10.0;

Затем вы должны получить

27.3

Ответ 3

попробуйте это

например

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

выход:

55.54

Ответ 4

    Double toBeTruncated = new Double("2.25");

    Double truncatedDouble=new BigDecimal(toBeTruncated ).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();

он вернет 2.3

Ответ 5

Если вам нужны эта и подобные операции чаще, может быть удобнее найти правильную библиотеку вместо ее реализации самостоятельно.

Вот одностроки, решая ваш вопрос из Apache Commons Math, используя Precision, Colt использует Functions, а Weka использует Utils:

double value = 540.512 / 1978.8 * 100;
// Apache commons math
double rounded1 = Precision.round(value, 1);
double rounded2 = Precision.round(value, 1, BigDecimal.ROUND_HALF_UP);
// Colt
double rounded3 = Functions.round(0.1).apply(value)
// Weka
double rounded4 = Utils.roundDouble(value, 1)

Зависимости Maven:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.5</version>
</dependency>

<dependency>
    <groupId>colt</groupId>
    <artifactId>colt</artifactId>
    <version>1.2.0</version>
</dependency>

<dependency>
    <groupId>nz.ac.waikato.cms.weka</groupId>
    <artifactId>weka-stable</artifactId>
    <version>3.6.12</version>
</dependency>

Ответ 6

Удобная альтернатива, которая, на мой взгляд, более читаема, но, возможно, менее эффективна из-за конверсий между double и String:

double num = 540.512;
double sum = 1978.8;

// NOTE: This does take care of rounding
String str = String.format("%.1f", (num/sum) * 100.0); 

Если вы хотите, чтобы ответ был двойным, вы могли бы, конечно, преобразовать его обратно:

double ans = Double.parseDouble(str);

Ответ 7

Ваш метод прав, все, что вам нужно сделать, это добавить a.0 после обоих десятков и устранить вашу проблему!

double example = Math.round((187/35) * 10.0) / 10.0;

Вывод будет:

5.3