Java中Scanner读取double类型数值报错,输入int正常求助
问题原因与解决方法
你遇到的是InputMismatchException,核心原因是Java的Scanner默认跟随系统区域设置的小数分隔符:
- 如果你的系统区域(比如欧洲部分国家)默认用逗号(
,)作为小数分隔,而你输入了英文格式的小数点(.),就会触发报错;反之同理。
解决办法
方法1:匹配系统区域的输入格式
直接按照系统默认的小数分隔符输入数值,比如系统用逗号就输入3,5,用小数点就输入3.5。
方法2:强制Scanner使用英文小数规则
在创建Scanner后,添加一行代码强制使用英文地区的解析规则,这样不管系统设置是什么,都能识别小数点(.):
in.useLocale(Locale.US);
记得要导入java.util.Locale包,修改后的完整代码如下:
import java.util.Scanner; import java.util.Locale; public class InpOutp { public static void main(String[] args) { Scanner in = new Scanner(System.in); in.useLocale(Locale.US); // 强制使用英文小数分隔规则 System.out.print("Enter price of a six-pack beer: "); double packPrice = in.nextDouble(); System.out.print("Give the ml of a can: "); double canMl = in.nextDouble(); final double CANS_PER_PACK = 6; double packMl = canMl * CANS_PER_PACK; // 计算每毫升价格 double pricePerMl = packPrice / packMl; System.out.printf("Price per ml: %8.3f", pricePerMl); System.out.println(); } }
方法3:字符串替换后转换(备选)
如果不想修改Locale,也可以先读取输入的字符串,替换分隔符后再转为double:
// 替换逗号为小数点,再转double double packPrice = Double.parseDouble(in.next().replace(',', '.'));
内容的提问来源于stack exchange,提问作者Dimitris Malkotsis
相关产品推荐
相关产品推荐

