货币转换器代码所需的帮助。有解决方案吗?

时间:2019-05-30 19:47:16

标签: java

我已经开始了在线课程“完整的Android N开发人员课程”,并且在某个部分中我对自己的代码有疑问,并且社区确实没有太多帮助。

我一直在尝试在线查看问题,并向课程社区问答提问。

public void convert(View view){
    editText dollarAmounteditText = (editText) findViewById(R.id.dollarAmounteditText);
    Double dollarAmountDouble = Double.parseDouble(dollarAmounteditText);
    Double poundAmount = dollarAmountDouble = 0.75;
    Toast.makeText(mainActivity.this,  "£" + String.format("%.2f", poundAmount ), Toast.LENGTH_SHORT).show();
    Log.i("amount" , dollarAmounteditText.getText().toString());
}

每当我尝试运行模拟器时,我也会收到此错误消息。

“ M仿真器:仿真器:错误:x86仿真当前需要硬件加速!”

1 个答案:

答案 0 :(得分:1)

切勿将double或BigDecimal用作货币;两者都荒谬。

您应始终标识货币的适当小数部分作为单位,并使用长整数来表示。 例如, 如果您使用美元, 那么一分钱(1/100美元的汇率)可能不错。 如果您要在货币之间进行转换, 那么1 / 10_000的基础货币(例如USD)可能是合理的。 在1 / 10_000基础货币的情况下, 在我的示例中,将以1美元(1美元)的价格存储10_000。 为1日元兑换1日元,您可能希望使用1 / 10_000_000美元作为1值(即以1美元的价格存储10_000_000)。

一旦您有合理的代表权, 对货币进行整数数学运算(长整数表示整数值)。

运行此命令以查看为什么double和BigDecimal不好。


import java.math.BigDecimal;

import org.junit.Test;

public class GoofballsUseDouble
{
    public void bigdecimalTest1()
    {
        final BigDecimal m1 = new BigDecimal(
            0.1d);
        final BigDecimal m2 = new BigDecimal(
            0.2d);
        final BigDecimal sum;

        sum = m1.add(m2);

        System.out.println("");
        System.out.println("bigdecimalTest1");
        System.out.println(" v1.a (0.1bd): " + m1);
        System.out.println(" v2.a (0.2bd): " + m2);
        System.out.println("sum.a (?): " + sum);
    }

    public void bigdecimalTest2()
    {
        final BigDecimal m1 = new BigDecimal(
            "0.1");
        final BigDecimal m2 = new BigDecimal(
            "0.2");
        final BigDecimal sum;

        sum = m1.add(m2);

        System.out.println("");
        System.out.println("bigdecimalTest2");
        System.out.println(" v1.a (0.1bds): " + m1);
        System.out.println(" v2.a (0.2bds): " + m2);
        System.out.println("sum.a (?): " + sum);
    }

    public void doubleTest()
    {
        final double m1 = 0.1d;
        final double m2 = 0.2d;
        final double sumM;

        sumM = m1 + m2;

        System.out.println("");
        System.out.println("doubleTest");
        System.out.println(" v1.a (0.1d): " + m1);
        System.out.println(" v2.a (0.2d): " + m2);
        System.out.println("sum.a (?): " + sumM);

        System.out.printf(" v1.b (0.1d): %f%n",
            m1);
        System.out.printf(" v2.b (0.2d): %f%n",
            m2);

        if (.3d == sumM)
        {
            System.out.println("it r equalz");
        }
        else
        {
            System.out.println("double is not exact, of course");
        }
    }

    @Test
    public void theTest()
    {
        doubleTest();

        bigdecimalTest1();

        bigdecimalTest2();
    }
}