限制显示的小数位数,只取小数以继续数学运算

Posted

技术标签:

【中文标题】限制显示的小数位数,只取小数以继续数学运算【英文标题】:Limiting number of decimals shown and take only the decimals to continue a math operation 【发布时间】:2016-08-19 08:31:53 【问题描述】:

我什至不知道如何开始,但我会尽力解释自己。

在 XML 中我必须编辑文本:

<EditText
        android:id="@+id/auftraggesamt_edit_text"
        android:layout_
        android:layout_
        android:background="#616161"
        android:imeOptions="actionDone"
        android:inputType="number"
        android:maxLength="5"
        android:textAlignment="textEnd"
        android:textColor="#ffffff"
        android:textCursorDrawable="@color/colorWhite"
        android:textStyle="bold"
        />

<EditText
        android:id="@+id/vorgabezeit"
        android:layout_
        android:layout_
        android:background="#616161"
        android:imeOptions="actionDone"
        android:inputType="numberDecimal"
        android:maxLength="5"
        android:textAlignment="textEnd"
        android:textColor="#ffffff"
        android:textCursorDrawable="@color/colorWhite"
        android:textStyle="bold"
        />

第一个定义为数字,第二个定义为 numberDecimal。在第一个中我只允许插入整数,在第二个中我还需要小数。 现在,在 Java 中:

public class MainActivity extends AppCompatActivity 

int procente = 120;
int mitarbeiter = 1;

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    findViewById(R.id.button)
            .setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View v) 
                    displayTarget((procente / Double.parseDouble(((EditText) findViewById(R.id.vorgabezeit))
                            .getText().toString())) * mitarbeiter) ;
                    displayTime((Double.parseDouble(((EditText) findViewById(R.id.auftraggesamt_edit_text))
                            .getText().toString())) / ( procente /  Double.parseDouble(((EditText) findViewById(R.id.vorgabezeit))
                            .getText().toString()) * mitarbeiter ) );
                
            );

这里(对你来说比对像我这样的新手更明显)定义了另外 2 个变量,采用 TextEdit 值并完成数学运算。 (感谢另一个 *** 用户)。

现在,在下面的几行中,我将值输出给用户:

private void displayTarget(double number) 
    TextView priceTextView = (TextView) findViewById(R.id.rezultat);
    priceTextView.setText(number + "  stück/std.");

private void displayTime(double timp) 
    TextView timeTextView = (TextView) findViewById(R.id.rezultat_ore);
    timeTextView.setText(timp + "  std");

现在是故事的问题部分:)

    两个结果都返回如下值:36.641221374045806(第二个结果:3.2749999999999995)。显示的小数位数是天文数字。 4 或 5 位小数对我和我无法完成的其他数学部分来说已经绰绰有余了。所以,问题是:如何使用我已经拥有的代码来限制屏幕上显示给用户的小数位数。

    根据结果对“displayTime”进行数学运算,逗号之前的值我想在另一个字段上显示它,但是,在第一次数学运算后产生的小数我必须将它与0.6 ant 将结果添加为逗号前值的小数。

我希望你们中的至少一个人能得到我所看到的图片,并且我已尽力解释它。 我知道我要求很多,但经过几个小时的搜索后,我空手而归。尝试了我能找到和想到的所有方法,但由于我在使用 Java 和 XML 的第一周有很大的限制,我可以在我的应用程序上走得更远。

谢谢大家的时间,至少是阅读这个故事,然后,也许花时间回答和解释......

最好的问候, 罗伯特

【问题讨论】:

尝试更简洁,将问题和代码限制在您实际的数字格式问题上。我会在函数文档中寻找允许指定精度的参数。如果这不可用,请修改数字字符串,例如搜索小数点位置,然后删除多余的字符。 你应该看看here,但是恕我直言,我猜你看到的结果是错误的,因为你正在经历floating point precision error 【参考方案1】:

我没有正确理解您的第二个问题,但是对于第一个问题,您可以使用如下 DecimalFormat:

DecimalFormat format = new DecimalFormat();
format.setMaximumFractionDigits(2);
String formattedText = format.format(your_variable);

您可以随时操作字符串来获得所需的结果。

    String full = "45.98";
    String substr1=full.substring(full.indexOf(".") + 1); //will return 98
    String substr2=full.substring(0, full.indexOf(".")); //willreturn 45

我的印象是您必须在 TextField 中显示它。对不起。 您始终可以将此 String 解析为 Double 值。

Double value = Double.parseDouble(your_string);

完成所有这些类型转换后,我确实认为可能有更好的方法来实现相同的。

【讨论】:

谢谢你,成功了! :D 关于第二个问题:我必须将结果数:ex:34.98 分成 34 和 98。 34 我将使用它的当前形式,我将乘以 0.6 ant 的 98 部分,结果我将以小数形式加到 34。最终结果将是 34.(98*0.6) = 34.588 ...或 34.59 很高兴我能帮上忙。 关于问题的第二部分,如果可能的话,还有一件事。我刚刚观察到一个错误:我得到了 5.3(而不是 5.30)的结果,后来我必须转换:5 (30*0.6) = 5 18 但因为我得到 5.3,所以最终结果是:5 (3*0.6) = 5 1.8 。不知何故,最后的 0 被切断了,这对数学的最后一部分是不利的...... 使用这个:format.setMinimumFractionDigits(2);我成功地展示了 rezult 5.30 但对于第二部分,我需要将 30 乘以 0.6,它仍然是 3 而不是 30 :(【参考方案2】:

为了回答您问题的第一部分,以下代码将根据您选择的精度限制小数点后显示的位数。 请注意,这会返回一个字符串并相应地对其进行四舍五入。

public static String decimalFormatter(Double number, int precision) 
        String pattern = "0.0";
        for (int i = 1; i < precision; i++) 
            pattern = pattern + "0";
        
        DecimalFormat df = new DecimalFormat(pattern);
        df.setRoundingMode(RoundingMode.DOWN);
        return df.format(number);

【讨论】:

以上是关于限制显示的小数位数,只取小数以继续数学运算的主要内容,如果未能解决你的问题,请参考以下文章

matlab如何设置小数点后位数?

c语言中如何保存一个位数不限的小数?

c语言如何控制小数位数?

EditText限制小数点前后位数

java中double型小数位数问题

EditText 限制输入整数和小数 的位数