[英]Java double Input Validation
以下是代碼:
Scanner scan = new Scanner(System.in);
String input = scan.next();
try{
double isNum = Double.parseDouble(input);
if(isNum == Math.floor(isNum)) {
System.out.println("Input is Integer");
//enter a double again
}else {
System.out.println("Input is Double");
//break
}
} catch(Exception e) {
if(input.toCharArray().length == 1) {
System.out.println("Input is Character");
//enter a double again
}else {
System.out.println("Input is String");
//enter a double again
}
}
取自這里: 如何檢查用戶輸入的數據類型有效性(Java Scanner類)
但是,當我輸入1.0或0.0時,它仍然被視為一個整數,1.0不被視為雙倍?
請幫幫我們,謝謝!
1.0
通常被認為是一個有效的雙精度,但代碼已被明確寫入威脅整數作為無效的雙精度(打印它們是整數)。 要更改此行為,請刪除內部if:
try{
double isNum = Double.parseDouble(input);
System.out.println("Input is Double");
} catch(Exception e) {
if(input.toCharArray().length == 1) {
System.out.println("Input is Character");
}else {
System.out.println("Input is String");
}
}
如果要將1.0
視為Double
1
作為Integer
,則需要使用input
變量( String
類型)。
Java將始終以Double y = 1.0
(意味着1
是有效的Double
)的方式處理Double x = 1
,因此您將無法用代碼區分它們。
由於您具有輸入的原始字符串表示形式,請使用正則表達式或其他一些驗證來檢查它。 例如,double的樣本正則表達式模式看起來像"[0-9]+(\\.){0,1}[0-9]*"
和整數"[0-9]+"
或"\\d+"
這是一個例子:
final static String DOUBLE_PATTERN = "[0-9]+(\.){0,1}[0-9]*";
final static String INTEGER_PATTERN = "\d+";
Scanner scan = new Scanner(System.in);
String input = scan.next();
if (Pattern.matches(INTEGER_PATTERN, input)) {
System.out.println("Input is Integer");
//enter a double again
} else if (Pattern.matches(DOUBLE_PATTERN, input)) {
System.out.println("Input is Double");
//break
} else {
System.out.println("Input is not a number");
if (input.length == 1) {
System.out.println("Input is a Character");
//enter a double again
} else {
System.out.println("Input is a String");
//enter a double again
}
}
檢查,如果您要驗證的字符串包含一個點 - 那么,如果parseDouble成功,則可以將其視為double值(即使對於1.0)。
檢查1.0是否等於1,數學上是正確的。 因此,您的第一個if將返回true,它將被視為int。 似乎程序的整個想法是檢查雙打,看看它們是否有小數。
Math.floor(x)
返回一個double,由於1.0確實與1.0相同,程序將進入第一個if塊。
我認為你的測試是有缺陷的。 根據條件,您說“ 0.0
和1.0
被解析為整數”
isNum == Math.floor(isNum)
雙精度浮點數不是隨機的比特垃圾:它們表示精確的數量,並且恰好可以精確表示數字0和1 (參見位模式) ,因此它們等於Math.floor(val)
(順便說一句,這發生在很多整數值上,而不僅僅是零和一個)
因此,您應該在代碼之前重新考慮您的測試。 考慮到用戶可能永遠不會輸入整數或雙精度 :她輸入的是十進制數 ,你應該根據它的用途來處理輸入(選擇是在String,BigDecimal,Number,Integer,Double和等...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.