Подтвердить что ты не робот

Как объединить число в Groovy?

Как объединить число в Groovy? Я хотел бы сохранить 2 десятичных знака.

Например (псевдокод):

round(1.2334695) = 1.23
round(1.2686589) = 1.27
4b9b3361

Ответ 1

Вы можете использовать:

Math.round(x * 100) / 100

Если x является BigDecimal (по умолчанию в Groovy), это будет точно.

Ответ 2

Если вы имеете дело с двойными или плавающими

Вы можете просто использовать

assert xyz == 1.789
xyz.round(1) == 1.8
xyz.round(2) == 1.79

Ответ 3

Используйте 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

Ответ 6

Возможно, более 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()}"

Ответ 7

Работа с @sjtai отличным ответом, это Mixin, который я использую практически для всех моих десятичных округлений:

class Rounding {
    public BigDecimal round(int decimalPlaces = 0, RoundingMode roundingMode = RoundingMode.HALF_EVEN) {
        return setScale(decimalPlaces, roundingMode);
    }
}

Если раунды по int по умолчанию и использует метод "четного" округления (уменьшение статистической ошибки по умолчанию - это всегда хорошо), но она по-прежнему позволяет вызывающему пользователю легко переопределить эти параметры.

Ответ 8

так просто:

YOUR_NUMBER = 1.234567
((int) YOUR_NUMBER * 100)/100

Примечание: это приведет к отключению дополнительных десятичных точек; он не округляется.

Ответ 9

Глядя на ответы @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