Как мне округлить число в Groovy? - PullRequest
32 голосов
/ 30 декабря 2010

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

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

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

Ответы [ 9 ]

33 голосов
/ 30 декабря 2010

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

Math.round(x * 100) / 100

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

26 голосов
/ 21 августа 2013

если вы имеете дело с Double´s или float´s

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

assert xyz == 1.789
xyz.round(1) == 1.8
xyz.round(2) == 1.79
18 голосов
/ 30 декабря 2010

Используйте 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
12 голосов
/ 30 декабря 2010

Как это:

def f = 1.2334695;
println new DecimalFormat("#.##").format(f);

Или вот так:

println f.round (new MathContext(3));

Выход:

1,23

Ссылка: Форматирование десятичного числа

9 голосов
/ 01 декабря 2015

Groovy добавляет метод round() к классам Double и Float, поэтому:

(123.456789f).round(2) == 123.46f

Источник: Округление чисел в Groovy

5 голосов
/ 16 сентября 2016

Вероятно, больше 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()}"
2 голосов
/ 08 октября 2013

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

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

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

1 голос
/ 11 марта 2018

Глядя на ответы @ 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
1 голос
/ 26 мая 2015

так просто, как это:

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

примечание: это обрезает лишние десятичные точки;это не округляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...