Math 什么';groovy数学有什么问题?
这对我来说似乎很奇怪,完全让我站在愿意使用纯java的人一边。在编写基于groovy的应用程序时,我遇到了这样的情况:Math 什么';groovy数学有什么问题?,math,object,groovy,Math,Object,Groovy,这对我来说似乎很奇怪,完全让我站在愿意使用纯java的人一边。在编写基于groovy的应用程序时,我遇到了这样的情况: int filesDaily1 = (item.filesDaily ==~ /^[0-9]+$/) ? Integer.parseInt(item.filesDaily) : item.filesDaily.substring(0, item.filesDaily.indexOf('.')) def filesDaily = (ite
int filesDaily1 = (item.filesDaily ==~ /^[0-9]+$/) ?
Integer.parseInt(item.filesDaily) : item.filesDaily.substring(0, item.filesDaily.indexOf('.'))
def filesDaily = (item.filesDaily ==~ /^[0-9]+$/) ?
Integer.parseInt(item.filesDaily) : item.filesDaily.substring(0, item.filesDaily.indexOf('.'))
那么,知道item.filesDaily是一个值为“1..*”的字符串怎么可能是filesDaily1等于49,filesDaily等于1
更重要的是,当你尝试做一些
int numOfExpectedEntries = filesDaily * item.daysToCheck
抛出一个异常,表示
Cannot cast object '111' with class 'java.lang.String' to class 'int'
用乘法指向精确的代码行。这是怎么发生的?您正在将此值赋给int:
item.filesDaily.substring(0, item.filesDaily.indexOf('.'))
我猜Groovy正在将单个字符串“1”转换为字符“1”,然后在正常的字符到整数转换中使用Unicode值。。。所以你得到的值是49
如果要将字符串解析为十进制数,请使用Integer.parseInt
而不是内置转换
filedaily1
和filedaily
之间的区别在于,您已经告诉Groovyfiledaily1
是一个int,因此它正在对int进行转换。我怀疑filedaily
实际上是测试用例中的字符串“1”
我怀疑您真的只是想将代码更改为:
String text = (item.filesDaily ==~ /^[0-9]+$/) ? items.filesDaily :
item.filesDaily.substring(0, item.filesDaily.indexOf('.'))
Integer filesDaily = text.toInteger()
您正在将此值指定给int:
item.filesDaily.substring(0, item.filesDaily.indexOf('.'))
我猜Groovy正在将单个字符串“1”转换为字符“1”,然后在正常的字符到整数转换中使用Unicode值。。。所以你得到的值是49
如果要将字符串解析为十进制数,请使用Integer.parseInt
而不是内置转换
filedaily1
和filedaily
之间的区别在于,您已经告诉Groovyfiledaily1
是一个int,因此它正在对int进行转换。我怀疑filedaily
实际上是测试用例中的字符串“1”
我怀疑您真的只是想将代码更改为:
String text = (item.filesDaily ==~ /^[0-9]+$/) ? items.filesDaily :
item.filesDaily.substring(0, item.filesDaily.indexOf('.'))
Integer filesDaily = text.toInteger()
这是groovy类型转换代码中的一个错误
int a = '1'
int b = '11'
返回不同的结果,因为使用了不同的转换器。在本例中,a
将为49,而b
将为11。为什么?
单字符到整数的转换(使用String.charAt(0)
)的优先级高于整数解析器
坏消息是,所有单字符串都会发生这种情况。您甚至可以执行inta='a'
,这将为您提供65
只要您无法知道字符串的长度,就必须使用
Integer.parseInt()
而不是依赖自动类型转换。这是groovy类型转换代码中的一个错误
int a = '1'
int b = '11'
返回不同的结果,因为使用了不同的转换器。在本例中,a
将为49,而b
将为11。为什么?
单字符到整数的转换(使用String.charAt(0)
)的优先级高于整数解析器
坏消息是,所有单字符串都会发生这种情况。您甚至可以执行inta='a'
,这将为您提供65
只要您无法知道字符串的长度,就必须使用
Integer.parseInt()
,而不是依赖自动类型转换。+1这显然是Groovy 2.0中要删除的内容之一,因为它令人困惑。。。单字符字符串通过char
转换为int
。。。多字符字符串抛出异常EAH。。。在发帖几秒钟后就注意到了。尽管异常消息仍然含糊不清。@den,但您认为可以将三元表达式更改为int filesDaily1=Integer.parseInt((item.filesDaily=~/^([0-9]+).$/)[0][1])
,这可能更简单一些。。。或否;-)@tim_yates,真的很不错,可能没有那么可读,但很酷+1它显然是Groovy 2.0中要删除的东西之一,因为它令人困惑。。。单字符字符串通过char
转换为int
。。。多字符字符串抛出异常EAH。。。在发帖几秒钟后就注意到了。尽管异常消息仍然含糊不清。@den,但您认为可以将三元表达式更改为int filesDaily1=Integer.parseInt((item.filesDaily=~/^([0-9]+).$/)[0][1])
,这可能更简单一些。。。或否;-)@tim_yates,真的很不错,可能没有那么可读,但很酷!我不认为这是一个bug,这是一个令人惊讶的特性;-)我不认为这是一个bug,这是一个令人惊讶的特性;-)