[英]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
而不是內置轉換。
這里的filesDaily1
和filesDaily
之間的區別是,您已經告訴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.