我有些困惑如何使用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: No signature of method: java.math.BigDecimal.round() is applicable for argument types: (java.lang.Integer) values: [2] Possible solutions: round(java.math.MathContext), find(), pow(int), power(java.lang.Integer), find(groovy.lang.Closure), and(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)
注意:我不想知道如何对双精度值进行四舍五入,我只想知道为什么groovy
在每种情况下的行为不同?
groovy
在每种情况下的行为不同。谢谢..:) - Saurabh GaurBigDecimal
或Double
。是的,你说得对,我的问题是“当Groovy决定将某些东西作为double而不是BigDecimal时?” - Saurabh Gaur