【问题标题】:Result: NaN will not work?结果:NaN 不起作用?
【发布时间】:2014-01-23 02:26:51
【问题描述】:

在应用程序中,我有不同的活动页面,要求用户输入数字数据。我想按如下方式存储数据,以便在最终活动中使用它:

public void onClick(View v) {
    String variable1 = input.getText().toString();
    Double.parseDouble(variable1); //stores information put into variable
        { Intent myintent = (new Intent(step1.this,step2.class));
        myintent.putExtra("variable1",variable1);
        startActivity(myintent);

我对所有其他活动执行相同的过程,直到我拥有的最后一个活动:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);{
    setContentView(R.layout.activity_iie);
    Bundle extras = getIntent().getExtras(); //retrieves variables stored for formula

    if(extras !=null){
        double variable1 = extras.getDouble("VARIABLE1");
        double vari2 = extras.getDouble("VARI2");
        double vari3 = extras.getDouble("VARI3");
        double finalvari = extras.getDouble("finalvari");
        double solution= ((((vari2 - vari1) / (vari3) + finalvari)));

        String lastString = "Result:" + solution; //prints out
        TextView lastText = (TextView) findViewById(R.id.solution1);
        lastText.setText(lastString);
    }

我没有任何错误,但是当我进行最后一项活动时,它会打印出“Result:NaN”。我试图弄清楚它为什么打印NaN;一切都设置为双。

这是什么原因造成的?

更新 @Melquiades

是的,我用双精度替换了字符串,如下所示:

'c.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
         double variable1 =  Double.parseDouble(input.getText().toString()); //stores information put into variable
        { Intent myintent = (new Intent(step1.this,step2.class));
        myintent.putExtra("variabele1",variabele1);
        startActivity(myintent);
        '

然后在我的最后一个活动中,假设打印答案:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);{
    setContentView(R.layout.activity_iie);
    Bundle extras = getIntent().getExtras(); //retrieves variables     stored         formula

if (extras != null){
        double variable1 = extras.getDouble("variable1");
        double vari2 = extras.getDouble("vari2");
        double vari3 = extras.getDouble("vari3");
        double engagement = extras.getDouble("engagement1");
        double solution= ((((vari2-variable1)/(vari3))+finalvari));
            String lastString = "Result:" +solution; //prints out 
            TextView lastText= (TextView) findViewById(R.id.solution1);
                    lastText.setText(lastString);

决定像您建议的那样发布更多内容以提供潜在帮助。

【问题讨论】:

    标签: java android android-activity nan


    【解决方案1】:

    在启动端,你只需多设置一个variable1

    在接收端,您尝试从 extras 中获取四个值:

    double variable1 = extras.getDouble("VARIABLE1");
    double vari2 = extras.getDouble("VARI2");
    double vari3 = extras.getDouble("VARI3");
    double finalvari = extras.getDouble("finalvari");
    

    如果密钥不存在,getDouble() 将返回 0.0

    现在,在这里

    double solution= ((((vari2-vari1)/(vari3)+finalvari)));
    

    除以零,在浮点数学中会导致结果不是数字 (NaN)。

    【讨论】:

    • 如前所述,我已经设置了所有额外的变量,只是为了节省你们阅读代码的时间,我没有发布剩余的变量。就设置而言,上述所有其他变量的编码与 variable1 相同(编码为代码的第一位)。如果我将 vari3 设置为 5 并且 finalvari 设置为 1(当我运行其他活动以在应用程序中输入变量数据时),我仍然不知道如何除以零。感谢您在上面的帖子。
    • 好的,然后在此处设置一个调试器断点并检查变量以查看 NaN 出现在您的表达式中的位置。然后一步步回去检查变量值是从哪里来的。
    • 我改变了等式,现在当我不像你说的那样除法时得到 0.0。但是我对为什么我现在得到 0.0 感到困惑,我对其他变量的处理与对变量 1 的处理相同。
    【解决方案2】:

    关键问题是将String 放入意图中:

    String variable1 = input.getText().toString();
    Double.parseDouble(variable1); //stores information put into variable
    //...
    myintent.putExtra("variable1",variable1); <- variable1 is a string,
    

    当你稍后用getDouble() 提取它时,你会得到,引用:

    0.0 如果给定键不存在所需类型的映射

    所以你应该把double 放在你的意图中:

    double variable1 = Double.parseDouble(input.getText().toString());
    myintent.putExtra("variable1",variable1);
    

    请注意,在提取双精度时使用相同的键字符串进行映射非常重要,即使用“variable1”,区分大小写:

    double extractedVar1 = extras.getDouble("variable1");
    

    您可以使用 extras.containsKey() 来验证您的映射是否存在。

    【讨论】:

    • 所以删除字符串部分并包含您刚才提到的内容?
    • 是的。我的意思是您希望double 在您的意图中,不是吗?所以,把double放在那里,而不是String。你可能想检查你先放在那里的双精度,例如:double variable1 = Double.parseDouble(input.getText().toString()); if (variable1 > 0) { // put into intent }
    • 现在去试试,稍后会回到这个帖子试试,非常感谢!
    【解决方案3】:

    所有建议都是正确的。但你犯了一个大错误......

    当您发送变量时,您可以:

    myIntent.putExtra("variable1", variable1);
    

    然后,当您收到时,您会这样做:

    double variable1 = extras.getDouble("VARIABLE1");
    

    你的钥匙不一样。 'variable1' 和 'VARIABLE1' 不相等,因此您可能得到的不是变量 1 的值,而是 0,而且您的所有计算都是错误的。

    因此,对键使用静态韵母是一种很好的做法。在您的第一个活动中声明:

    public static final String KEY_VARIABLE1 = "variable1";
    

    在插入意图时使用它:

    myIntent.putExtra(KEY_VARIABLE1, variable1);
    

    并且在检索时:

    double variable = extras.getDouble(ActivityWhereThisKeyIsDeclared.KEY_VARIABLE1);
    

    为所有变量执行此操作。

    【讨论】:

    • 我修复了密钥,但仍然得到 NaN。例如,当我检查我使用的变量的活动时,(50,100,5,1) 所以当我手动将其插入时,我得到 (((100-50)/5)+1)。我是否必须为密钥进行统计决赛才能获得 NaN(稍后会返回并修复它),而只是试图摆脱 NaN。
    • 你有没有在建议的地方使用双打而不是字符串?在接收活动中添加 Log.d() 并输出变量 1、变量 2、变量 3 和最终变量的值——它们是什么?此外,在您的帖子中添加当前代码。
    • 如果您确定输入的是double,而不是String,请按照Melquiades 的建议打印您提取的内容。您可以使用意图提取值。getDoubleExtra developer.android.com/reference/android/content/…, double) 而不是首先提取 Bundle。这样你就可以指定默认值,所以如果它们不存在,你将永远不会得到 0.0。
    • 我会发布我发布的内容,但它不会让我,因为我只有 5 名声望并且需要 10 名声望,因为代码太长而无法在评论中发布并且无法写在我的答案中.
    • 您的密钥仍然不同,发送时您使用“variablee1”,接收“variable1”时。按照建议对键使用静态决赛,然后报告。
    猜你喜欢
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2014-07-22
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多