Использование Math.round для округления до одного знака после запятой?
У меня есть эти две переменные
double num = 540.512
double sum = 1978.8
Тогда я сделал это выражение
double total = Math.round((num/ sum * 100) * 10) / 10;
но я в конечном итоге с 27,0.
На самом деле у меня есть много других переменных, и когда я использую их в выражении, я всегда получаю 0 на десятом месте.
9 ответов
Полезный метод, который я создал некоторое время назад...
private static double round (double value, int precision) {
int scale = (int) Math.pow(10, precision);
return (double) Math.round(value * scale) / scale;
}
Попробуй это
например
DecimalFormat df = new DecimalFormat("#.##");
df.format(55.544545);
выход:
55.54
Double toBeTruncated = new Double("2.25");
Double truncatedDouble=new BigDecimal(toBeTruncated ).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
вернется 2.3
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
Если вам нужна эта и подобные операции чаще, может быть удобнее найти нужную библиотеку, чем реализовывать ее самостоятельно.
Вот одна строка, решающая ваш вопрос из Apache Commons Math с использованием Precision, Colt с использованием функций и 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>
Double number = new Double("5.25");
Double tDouble =
new BigDecimal(number).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
это вернет это вернет 5.3
Оптимальная альтернатива, которая, на мой взгляд, гораздо более читабельна, но, возможно, чуть менее эффективна из-за преобразований между 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);
DecimalFormat decimalFormat = new DecimalFormat(".#");
String result = decimalFormat.format(12.763); // --> 12.7
Ваш метод правильный, все, что вам нужно сделать, это добавить.0 после обоих десятков, и это решит вашу проблему!
double example = Math.round((187/35) * 10.0) / 10.0;
Выход будет:
5.3