Android输入框处理长十进制数崩溃问题求助
我来帮你解决这个问题~
你遇到的核心问题有两个:
Integer.parseInt()只能解析纯整数字符串,一旦输入带小数的内容,会直接抛出NumberFormatException,这就是程序崩溃的原因- 用
int类型做除法运算(比如num5 / num4)会直接截断小数部分,完全不符合你需要支持长小数的业务需求
下面给你两种针对性的解决方案,你可以根据业务场景选择:
方案1:用Double处理普通小数场景
如果你的业务对精度要求不是极高(比如非金额类计算),用double类型就能满足需求,修改后的代码如下:
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button addBuyInButton = (Button) findViewById(R.id.addBuyInButton); addBuyInButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText feeNumEditText = findViewById(R.id.feeNumEditText); EditText buyInNumEditText = findViewById(R.id.buyInNumEditText); TextView targetTextView = findViewById(R.id.targetTextView); try { // 替换成Double.parseDouble,支持解析带小数的字符串 double num1 = Double.parseDouble(feeNumEditText.getText().toString()); double num2 = Double.parseDouble(buyInNumEditText.getText().toString()); double num3 = 3; double num4 = 100; double num5 = num1 + num3; double num6 = num5 / num4; double num7 = num6 * num2; double num8 = num7 + num2; // 控制显示的小数位数,比如保留2位,避免过长的小数输出 targetTextView.setText(String.format("%.2f", num8)); } catch (NumberFormatException e) { // 处理用户输入非数字的情况,给友好提示 targetTextView.setText("请输入有效的数字"); e.printStackTrace(); } } }); } }
关键改动说明:
- 把所有
int类型替换为double,支持小数运算 - 用
Double.parseDouble()替代Integer.parseInt(),可以正常解析带小数的输入 - 增加
try-catch捕获异常,避免输入非法内容时程序崩溃,同时给用户提示 - 用
String.format()控制输出的小数位数,优化显示效果
方案2:用BigDecimal处理高精度场景
如果你的业务涉及金额、税费这类对精度要求极高的场景,double的浮点精度丢失问题(比如0.1+0.2≠0.3)会引发问题,推荐用BigDecimal:
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import java.math.BigDecimal; import java.math.RoundingMode; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button addBuyInButton = (Button) findViewById(R.id.addBuyInButton); addBuyInButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText feeNumEditText = findViewById(R.id.feeNumEditText); EditText buyInNumEditText = findViewById(R.id.buyInNumEditText); TextView targetTextView = findViewById(R.id.targetTextView); try { // 用BigDecimal解析字符串,完全避免精度丢失 BigDecimal num1 = new BigDecimal(feeNumEditText.getText().toString()); BigDecimal num2 = new BigDecimal(buyInNumEditText.getText().toString()); BigDecimal num3 = new BigDecimal("3"); BigDecimal num4 = new BigDecimal("100"); BigDecimal num5 = num1.add(num3); // 除法必须指定保留位数和舍入模式,防止除不尽抛出异常 BigDecimal num6 = num5.divide(num4, 10, RoundingMode.HALF_UP); BigDecimal num7 = num6.multiply(num2); BigDecimal num8 = num7.add(num2); // 显示时保留2位小数,采用四舍五入 targetTextView.setText(num8.setScale(2, RoundingMode.HALF_UP).toString()); } catch (NumberFormatException e) { targetTextView.setText("请输入有效的数字"); e.printStackTrace(); } catch (ArithmeticException e) { // 处理除法未设置舍入模式的异常 targetTextView.setText("计算出错"); e.printStackTrace(); } } }); } }
关键优势:
- 完全避免浮点精度丢失问题,适合高精度计算场景
- 除法操作强制指定舍入模式,避免除不尽时抛出异常
- 可以灵活控制输出的小数位数和舍入规则
内容的提问来源于stack exchange,提问作者user1812725
相关产品推荐
相关产品推荐

