You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android输入框处理长十进制数崩溃问题求助

我来帮你解决这个问题~

你遇到的核心问题有两个:

  1. Integer.parseInt()只能解析纯整数字符串,一旦输入带小数的内容,会直接抛出NumberFormatException,这就是程序崩溃的原因
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:45:45