Как объединить число в Groovy? Я хотел бы сохранить 2 десятичных знака.
Например (псевдокод):
round(1.2334695) = 1.23
round(1.2686589) = 1.27
Как объединить число в Groovy? Я хотел бы сохранить 2 десятичных знака.
Например (псевдокод):
round(1.2334695) = 1.23
round(1.2686589) = 1.27
Вы можете использовать:
Math.round(x * 100) / 100
Если x
является BigDecimal
(по умолчанию в Groovy), это будет точно.
Если вы имеете дело с двойными или плавающими
Вы можете просто использовать
assert xyz == 1.789
xyz.round(1) == 1.8
xyz.round(2) == 1.79
Используйте mixin.
class Rounding {
public BigDecimal round(int n) {
return setScale(n, BigDecimal.ROUND_HALF_UP);
}
}
Добавьте это в свой класс запуска и round() - это метод класса BigDecimal первого класса:
BigDecimal.mixin Rounding
Тестовые случаи:
assert (new BigDecimal("1.27")) == (new BigDecimal("1.2686589").round(2))
assert (1.2686589).round(2) == 1.27
assert (1.2334695).round(2) == 1.23
Вот так:
def f = 1.2334695;
println new DecimalFormat("#.##").format(f);
Или вот так:
println f.round (new MathContext(3));
Вывод:
1,23
Ссылка: Форматирование десятичного числа
Groovy добавляет метод round()
к классам Double
и Float
, поэтому:
(123.456789f).round(2) == 123.46f
Источник: Число округлений в Groovy
Возможно, более Groovysh будет использовать этот фрагмент (x as double).round(2)
следующим образом:
def a = 5.2355434
println "a = $a, a.class = ${a.getClass()}"
def b = (a as double).round(2)
println "b = $b, b.class = ${b.getClass()}"
Работа с @sjtai отличным ответом, это Mixin, который я использую практически для всех моих десятичных округлений:
class Rounding {
public BigDecimal round(int decimalPlaces = 0, RoundingMode roundingMode = RoundingMode.HALF_EVEN) {
return setScale(decimalPlaces, roundingMode);
}
}
Если раунды по int
по умолчанию и использует метод "четного" округления (уменьшение статистической ошибки по умолчанию - это всегда хорошо), но она по-прежнему позволяет вызывающему пользователю легко переопределить эти параметры.
так просто:
YOUR_NUMBER = 1.234567
((int) YOUR_NUMBER * 100)/100
Примечание: это приведет к отключению дополнительных десятичных точек; он не округляется.
Глядя на ответы @sjtai и @cdeszaq, вам не нужно смешиваться с mixin, если вы просто определите метод, подобный следующему:
def bigDecimalRound(n,decimals){
return(n.setScale(decimals, BigDecimal.ROUND_HALF_UP))
}
Округление осуществляется встроенным методом BigDecimal
setScale
.
println(1.2334695.setScale(2, BigDecimal.ROUND_HALF_UP))
>> 1.23
Стоит также отметить, что setScale принимает отрицательные аргументы для округления вещей до большего порядка, т.е.
println(123.2334695.setScale(-1, BigDecimal.ROUND_HALF_UP))
>> 1.2E+2