【发布时间】:2016-09-09 11:13:20
【问题描述】:
我对使用double 值有点困惑。
当我使用如下:-
double foo = 20.46455
assert 20 == foo.round()
assert 20.46 == foo.round(2)
一切正常。但是当我使用类似的东西时:-
def foo = 20.46455
assert 20 == foo.round()
它抛出:-
java.lang.NullPointerException
和
def foo = 20.46455
assert 20.46 == foo.round(2)
它抛出:-
groovy.lang.MissingMethodException:没有方法签名:java.math.BigDecimal.round() 适用于参数类型:(java.lang.Integer) 值:[2] 可能的解决方案:round(java.math.MathContext)、find()、pow(int)、power(java.lang.Integer)、find(groovy.lang.Closure)和(java.lang.Number)
这意味着默认情况下在groovy 中,值保留在BigDecimal 和BigDecimal.round() 期望java.math.MathContext 作为输入。
但是当我使用Math.round() 时,我的困惑开始了,除了double 作为输入,然后为什么下面的语句被传递,而 groovy 默认保存在BigDecimal?
def foo = 20.46455
assert 20 == Math.round(foo)
为什么我必须使用.toDouble() 来通过我的测试用例,而foo 的值在double 格式如下?
def foo = 20.46455
assert 20 == foo.toDouble().round()
assert 20.46 == foo.toDouble().round(2)
注意 :- 我不想知道如何 round 一个双精度值,我只想知道为什么 groovy 在每种情况下的行为不同??
【问题讨论】:
-
@yash 我不想四舍五入我只想知道为什么
groovy在每种情况下的行为都不同。谢谢..:) -
@NathanHughes 实际上我知道如何舍入
BigDecimal或Double.. 是的,你是对的,我的问题是when groovy decides to make something a double vs BigDecimal? -
我也更新了问题的标题,谢谢..:)
-
不要忘记添加缺失的数据类型,而不是让 groovy 假设!为我工作!
标签: groovy double bigdecimal