Groovyで数値を丸めるにはどうすればよいですか?小数点以下2桁を保持したいと思います。
例(擬似コード):
round(1.2334695) = 1.23
round(1.2686589) = 1.27
ダブルスまたはフロートを扱っている場合
単純に使用できます
assert xyz == 1.789
xyz.round(1) == 1.8
xyz.round(2) == 1.79
ミックスインを使用します。
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
参照: 10進数のフォーマット
おそらく、より多くの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
に丸め、「偶数」の丸め方法を使用する場合(デフォルトで統計誤差を減らすことは常に良いことですが)、それでも呼び出し側はこれらを簡単にオーバーライドできます。
@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
これと同じくらい簡単:
YOUR_NUMBER = 1.234567
((int) YOUR_NUMBER * 100)/100
注:これにより、余分な小数点が切り捨てられます。切り上げられません。