如何在Groovy中舍入一个数字?我想保留2位小数。
例如(伪代码):
round(1.2334695) = 1.23
round(1.2686589) = 1.27
答案 0 :(得分:32)
答案 1 :(得分:25)
如果您处理Double或浮动的
你可以简单地使用
assert xyz == 1.789
xyz.round(1) == 1.8
xyz.round(2) == 1.79
答案 2 :(得分:18)
使用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
答案 3 :(得分:12)
像这样:
def f = 1.2334695;
println new DecimalFormat("#.##").format(f);
或者像这样:
println f.round (new MathContext(3));
输出:
1.23
答案 4 :(得分:9)
Groovy为round()
和Double
类添加了Float
方法,因此:
(123.456789f).round(2) == 123.46f
答案 5 :(得分:5)
可能更多 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()}"
答案 6 :(得分:2)
从@ sjtai的优秀答案开始,这是我用于几乎所有十进制舍入需求的Mixin:
class Rounding {
public BigDecimal round(int decimalPlaces = 0, RoundingMode roundingMode = RoundingMode.HALF_EVEN) {
return setScale(decimalPlaces, roundingMode);
}
}
如果默认情况下舍入到int
并使用“偶数”舍入方法(默认情况下减少统计错误总是一件好事),但它仍然允许调用者轻松覆盖这些。
答案 7 :(得分:1)
就这么简单:
wxUSE_GRAPHICS_GDIPLUS
注意:这会切断多余的小数点;它没有结束。
答案 8 :(得分:1)
如果你只是定义一个这样的方法,那么看看@ 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
答案 9 :(得分:1)
例如:
def rd = 1.3425345352
sd = ((float)rd).round(3)
println sd
>> 1.343
答案 10 :(得分:0)
您可以将任何数字转换为 float ,然后将round()
函数用作:
((float)1.2334695).round(2)
答案 11 :(得分:0)
这对于 Groovy 来说非常复杂。它通常......更时髦。
您需要创建一个 MathContext 对象来进行舍入。
num = 9.59123331333g
// rounds to 2 places, rounding up by default
mc = new java.math.MathContext(2)
num.round(mc)
==> Result: 7.0
得到帮助