如何用Java实现循环提示用户输入以.20或.45结尾的正数?
解决方案
直接使用double做小数判断容易遇到浮点数精度误差(例如0.20在内存中可能存储为近似值0.19999999999999996),因此更可靠的方式是将数值转换为两位小数对应的整数,再判断余数是否符合要求。
完整可运行代码
import java.util.Scanner; public class ValidInputChecker { public static void main(String[] args) { Scanner input = new Scanner(System.in); double inputValue; boolean isInputValid; // 循环直到输入符合要求 do { System.out.println("Enter a positive value ending in .20 or .45:"); inputValue = input.nextDouble(); // 判断是否为正数 boolean isPositive = inputValue > 0; // 将数值放大100倍后取整,消除小数精度问题 long scaledValue = Math.round(inputValue * 100); // 判断小数部分是否为20或45 boolean hasValidDecimal = (scaledValue % 100 == 20) || (scaledValue % 100 == 45); isInputValid = isPositive && hasValidDecimal; if (!isInputValid) { System.out.println("Invalid input. Please try again."); } } while (!isInputValid); System.out.println("Valid input accepted: " + inputValue); input.close(); } }
核心逻辑说明
- 正数校验:
inputValue > 0直接判断输入是否为正数。 - 小数部分校验:
Math.round(inputValue * 100):把输入值放大100倍后取整,将15.20转为1520、7.45转为745,规避浮点数的精度偏差。scaledValue % 100:取整后的数值对100取模,得到的结果就是原数的两位小数部分,只需判断是否等于20或45即可。
补充说明
如果要求输入必须严格以.20或.45作为结尾(比如5.2不算有效输入),可以改用字符串解析的方式:
// 替换原有的小数校验逻辑 String inputStr = input.next(); boolean hasValidSuffix = inputStr.endsWith(".20") || inputStr.endsWith(".45"); // 同时还要额外判断字符串是否能转为正数 try { inputValue = Double.parseDouble(inputStr); isPositive = inputValue > 0; } catch (NumberFormatException e) { isPositive = false; } isInputValid = isPositive && hasValidSuffix;
这种方式会严格校验输入的格式,但需要处理格式错误的异常情况。
内容的提问来源于stack exchange,提问作者Qurqoise
相关产品推荐
相关产品推荐

