时髦的数学有什么问题?

时间:2011-06-20 14:29:15

标签: math object groovy

这对我来说似乎很奇怪,完全让我站在愿意使用普通java的人的一边。在编写基于groovy的应用程序时,我遇到了这样的事情:

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 .. *'的String,怎么可能,filesDaily1等于49而filesDaily等于1?

当尝试做类似

的事情时,更重要的是
int numOfExpectedEntries = filesDaily * item.daysToCheck

抛出异常说

Cannot cast object '111' with class 'java.lang.String' to class 'int'

指向带有乘法的精确代码行。怎么会发生这种情况?

2 个答案:

答案 0 :(得分:5)

您将此值分配给int:

item.filesDaily.substring(0, item.filesDaily.indexOf('.'))

猜测 Groovy正在将单字符串“1”转换为char'1',然后在正常的char-to-int转换中获取Unicode值...所以你最终得到了49。

如果要将字符串解析为十进制数,请使用Integer.parseInt而不是内置转换。

filesDaily1filesDaily之间的区别在于你告诉Groovy filesDaily1是一个int,所以它正在应用转换为int。我怀疑filesDaily实际上是测试用例中的字符串“1”。

怀疑您真的只想将代码更改为:

String text = (item.filesDaily ==~ /^[0-9]+$/) ? items.filesDaily :
                   item.filesDaily.substring(0, item.filesDaily.indexOf('.'))
Integer filesDaily = text.toInteger()

答案 1 :(得分:4)

这是groovy类型转换代码中的一个错误。

int a = '1'
int b = '11'

返回不同的结果,因为使用了不同的转换器。在示例中,a将为49,而b将为11.为什么?

单字符到int转换(使用String.charAt(0))的优先级高于整数解析器。

坏消息是所有单个字符串都会发生这种情况。你甚至可以int a = 'A'给你65。

只要您无法知道字符串的长度,就必须使用Integer.parseInt()而不是依赖于自动类型转换。