Java基于自定义Real类实现输入建对象与数值还原方法
现有代码的核心问题点
- 方法职责错位:需求要求的“接收用户输入创建Real对象”的
createRealObject()方法没有实现,反而把这段逻辑写到了无参的createRealNumber()里,有参的转换方法留空 - 输入读取逻辑错误:用
sc.nextLong()读取实数,碰到小数点会直接抛输入类型不匹配异常 - 返回值类型不匹配:原
createRealNumber方法定义的返回值是long,只能存储整数,没法承载带小数的实数,会丢失精度 - Real对象构造逻辑缺失:创建对象后没有把用户输入的内容存入对象的字段,默认构造的对象所有字段都是0
- 数值转换逻辑缺失:有参的转换方法没有从Real对象里取字段做计算,直接返回固定的0
修正后的可运行代码
import java.util.Scanner; public class RealApplication { // 实现需求1:接收用户输入,创建对应的Real类对象 public Real createRealObject() { Scanner sc = new Scanner(System.in); System.out.print("Please, enter a real number: "); String inputContent = sc.nextLine().trim(); long wholeNumPart = 0; long decimalPart = 0; // 按小数点拆分输入内容 if (inputContent.contains(".")) { String[] parts = inputContent.split("\\."); // 解析整数部分 if (!parts[0].isEmpty()) { wholeNumPart = Long.parseLong(parts[0]); } // 解析小数部分 if (parts.length > 1 && !parts[1].isEmpty()) { decimalPart = Long.parseLong(parts[1]); } } else { // 纯整数场景直接解析 wholeNumPart = Long.parseLong(inputContent); } // 传入拆分好的字段值,构造Real对象返回 return new Real(wholeNumPart, decimalPart); } // 实现需求2:接收Real对象,返回其表示的实际实数 public double createRealNumber(Real num) { long whole = num.getWholeNumPart(); long decimal = num.getDecimalPart(); // 计算小数部分的位权,还原小数真实值 int decimalDigits = String.valueOf(decimal).length(); double decimalRealValue = decimal / Math.pow(10, decimalDigits); // 拼接整数和小数部分,返回最终实数 return whole + decimalRealValue; } // 测试入口 public static void main(String[] args) { RealApplication app = new RealApplication(); Real userInputReal = app.createRealObject(); System.out.println("The real number represented by the object is: " + app.createRealNumber(userInputReal)); } }
逻辑说明
- 输入读取改用整行字符串读取,配合小数点分割,兼容带小数、纯整数、小数点前无数字的输入场景,解决原方法读不到带小数内容的问题
- 构造Real对象时直接把拆分得到的整数、小数值传入类的有参构造器,不再生成全0的空对象
- 转换方法里通过计算存为long的小数部分的位数,还原小数的实际位权,解决原方法返回固定0值的问题
注意:现有你定义的Real类存在结构设计缺陷——只存储了小数的数字内容,没有存储小数的位数,遇到类似
0.01和0.1这类带前导零的小数,会出现转换精度偏差。如果需要完全精确的精度,需要在Real类中新增一个存储小数位数的字段,当前实现基于已有的类结构完成,覆盖常规无前置零的小数输入场景。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

