如何解决java.lang.NumberFormatException: For input string: "396.00"报错
问题原因
- 异常的直接触发原因是你使用
Integer.parseInt()、Integer.valueOf()方法解析带小数点的字符串"396.00",Integer类仅支持解析纯整数格式的字符串,无法识别小数点和小数位,因此抛出NumberFormatException。 - 更深层的问题是金额类数据选型错误:付款金额、总余额这类涉及财务计算的字段,使用int类型存储本身就存在精度丢失风险,不符合业务数据存储规范。
解决方案
推荐使用Java标准的财务金额类型BigDecimal处理该场景,同时同步调整数据库字段类型,完整修改后的代码如下:
if(jCheckBox1.isSelected()) { String bx="Insert into supplierpaymenttable(Supplier_ID,SupplierInvoice_ID,User_ID,InvoiceNo,TotalAmount,PaymentAmount,RemainingBalance) VALUES (?,?,?,?,?,?,?)"; PreparedStatement pay=conn.prepareStatement(bx); // 直接将输入的带小数字符串转为BigDecimal,避免精度丢失 BigDecimal totalAmount = new BigDecimal(jTextField5.getText().trim()); // 计算剩余余额,保留你原有总金额减总付款的逻辑 BigDecimal remainingBalance = totalAmount.subtract(totalAmount); pay.setString(1,String.valueOf(supplier)); pay.setString(2,String.valueOf(det)); pay.setString(3,"1"); pay.setString(4, String.valueOf(invoie)); // 使用setBigDecimal绑定SQL参数 pay.setBigDecimal(5, totalAmount); pay.setBigDecimal(6, totalAmount); pay.setBigDecimal(7, remainingBalance); int rsdets= pay.executeUpdate(); }
同时需要将MySQL表supplierpaymenttable中TotalAmount、PaymentAmount、RemainingBalance三个字段的类型从INT调整为DECIMAL(12,2),12为总位数、2为保留小数位,可根据实际业务需求调整数值。
如果你的业务明确不需要小数位,也可以选择先截取字符串的小数部分再转为int,仅作为临时兼容方案使用:
String amountStr = jTextField5.getText().trim(); // 截取小数点前的整数部分 if (amountStr.contains(".")) { amountStr = amountStr.split("\\.")[0]; } int k = Integer.parseInt(amountStr);
内容的提问来源于stack exchange,提问作者ahad nadeem
相关产品推荐
相关产品推荐

