web-dev-qa-db-ja.com

Groovyで数値を丸めるにはどうすればよいですか?

Groovyで数値を丸めるにはどうすればよいですか?小数点以下2桁を保持したいと思います。

例(擬似コード):

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

次を使用できます。

Math.round(x * 100) / 100

xBigDecimal(Groovyの デフォルト )の場合、これは正確です。

33

ダブルスまたはフロートを扱っている場合

単純に使用できます

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

ミックスインを使用します。

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
18
sjtai

このような:

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

またはこのように:

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

出力:

1.23

参照: 10進数のフォーマット

12

Groovyはround()メソッドをDoubleおよびFloatクラスに追加します。したがって、

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

ソース: Groovyの端数

10
10GritSandpaper

おそらく、より多くの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()}"
5
lospejos

@sjtaiの素晴らしい答えから、これは私がほぼすべての小数の丸めのニーズに使用するMixinです:

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

デフォルトでintに丸め、「偶数」の丸め方法を使用する場合(デフォルトで統計誤差を減らすことは常に良いことですが)、それでも呼び出し側はこれらを簡単にオーバーライドできます。

2
cdeszaq

@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
kpie

これと同じくらい簡単:

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

注:これにより、余分な小数点が切り捨てられます。切り上げられません。

1
Zahra