簡體   English   中英

Groovy數學怎么了?

[英]What's wrong with groovy math?

這對我來說似乎很奇怪,完全讓我站在願意使用純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 .. *'的字符串,怎么可能,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”轉換為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()

這是常規類型轉換代碼中的錯誤。

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

因為使用了不同的轉換器,所以返回不同的結果。 在示例中, a為49,而b為11。為什么?

單字符到整數的轉換(使用String.charAt(0) )具有比整數解析器更高的優先級。

壞消息是,所有單個字符串都會發生這種情況。 您甚至可以將int a = 'A' ,這樣您就可以得到65。

只要您無法知道字符串的長度,就必須使用Integer.parseInt()而不是依靠自動類型轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM