Я несколько часов пытался получить правильные результаты с помощью BigDecimal
.
У меня номер 7.7049. Я хочу сначала округлить до 3 цифр. Я возьму 7.705. Затем округлить до 2 цифр. У меня должно получиться 7,71.
Я пробовал это:
BigDecimal(result).setScale(2, RoundingMode.HALF_UP) //instead of 2 can be any other number
Но я получаю неправильный номер: 7.70
.
Я пробовал разные режимы. Я тоже пробовал valueOf(result.toDouble())
и ничего не работает.
Проблема здесь выглядит так: setScale
работает только с двумя последними цифрами после .
и игнорирует остальные.
Как я могу это исправить?
ОБНОВЛЕНО:
Еще примеры:
7,7019 должно быть 7,70 | 7,7052 должно быть 7,71 | 7,7071 должно быть 7,71 | 7,7030 должно быть 7,70
@jrook Нет. Мне нужно простое математическое округление, а не всегда ВВЕРХ. Я имею в виду 7.7049
должно быть 7.71
, но 7.7039
должно быть 7.70
Вы знаете, что делает RoundingMode.HALF_EVEN
? Почему вы ожидаете, что 7,7049 станет 7,71? «Нормальное» округление сделает его равным 7,70, потому что ,049 ближе к ,0, чем к ,1.
Я не думаю, что существует модель округления, которая округляет 7,7049 до 7,71, но 7,7039 округляет до 7,71, потому что это не имеет смысла.
Пожалуйста, приведите больше примеров, чтобы прояснить, что вы действительно хотите сделать. 7.030 7.040 7.041 -7.039
и т. д. Кроме того, как отмечали другие комментаторы, это не обычное математическое округление, даже если оно каким-то образом достижимо. Вы можете обратиться к docs.oracle.com/javase/7/docs/api/java/math/RoundingMode.html
Похоже, вы хотите сначала округлить 7.7049
до 7.705
, а затем округлить до 7.71
- Округление 7.7049
округляет до 7.70
@Dioxin Да, вот так, но одним действием, если это возможно
Нет ни одного действия, которое бы выполняло это округление так, как вы описали, потому что это такой необычный и нестандартный способ округления.
@LouisWasserman Большое спасибо за четкий комментарий
Вы можете сначала округлить первые 3 цифры, а затем первые две цифры, чтобы получить то, что вы хотите.
BigDecimal a = new BigDecimal("7.7039")
.setScale(3, RoundingMode.HALF_UP)
.setScale(2, RoundingMode.HALF_UP);
Результаты совместимы с вашими тестовыми примерами. Я не проверял это для отрицательных чисел, и, вероятно, это не даст ожидаемых результатов для чисел с произвольной точностью.
Вы можете обратиться к документам RoundingMode и использовать эту идею, чтобы, возможно, придумать схему, которая округляет числа нестандартным способом, который вам нужен.
Проблема проста. У меня номер 7.7049. Когда я хочу округлить до 3 цифр после . Я получу 7,705, но когда я округлю это больше, чтобы 2 цифры я должен увидеть 7,71.
Вы уже упомянули, что вам нужно сделать, т.е. округлить сначала в масштабе 3
, а затем в масштабе 2
.
Демо:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
System.out.println(roundNumber(7.7019, 3, 2));
System.out.println(roundNumber(7.7052, 3, 2));
System.out.println(roundNumber(7.7071, 3, 2));
System.out.println(roundNumber(7.7030, 3, 2));
System.out.println(roundNumber(7.7049, 3, 2));
System.out.println(roundNumber(7.7039, 3, 2));
}
static BigDecimal roundNumber(double num, int scaleRound1, int scaleRound2) {
return new BigDecimal(num).setScale(scaleRound1, RoundingMode.HALF_UP).setScale(scaleRound2,
RoundingMode.HALF_UP);
}
}
Выход:
7.70
7.71
7.71
7.70
7.71
7.70
Как насчет
RoundingMode.CEILING
?