以Java总计账单

这个问题在这里已经有了答案:

  • 为什么不使用Double或Float来表示货币? 14个答案

  • 查看result.setText("Tip Amount : " + " $ " + Double.toString(tip_cal)); ,我猜你在输出中获得了很多9。 双打不能存储美分,所以数学将关闭,但如果你不是一个金融机构,只处理<10,000美元的交易,做

    result.setText(String.format("Tip Amount :$%.2f", tip_cal));

    还有一件事: decimalFormat.format(totalcost); 最好不要运行,最坏的情况是线程安全问题。 它不会改变总成本,它会返回一个StringBuffer(它显示了它的年龄)。


    你真的想在这里使用BigDecimal,而不是Double。 正如@大卫提到的,“双打不能准确存储美分”。 BigDecimal类型可以。 BigDecimal可以精确控制精度和舍入。

    它的数据类型比双精度要慢得多,但对于财务应用程序来说,它远远好得多。

    诚然,一个简单的小费计算器不是高财务,但基本原则仍然适用。 当操作诸如美元值之类的东西时,BigDecimal是一种更好的数据类型。


    有两件事情在我身上跳出来......

    First Math.round可以向下舍入,因此5.22的值将舍入为6 ,而不是7

    现在,您可以使用(int)totalcost + 1 ,它根据您的需要基本修剪小数元素或Math.ceil(totalcost)

    第二个是你似乎不明白格式化程序是如何使用的

    decimalFormat.format(totalcost);
    

    不会做任何事情,数字是免费的格式信息。 相反,您使用格式化程序以指定格式返回值的表示形式...

    所有的东西都藏在我们的腰带之下,像......

    String tipFormat = decimalFormat.format((tip_cal)
    
    DecimalFormat decimalFormat = new DecimalFormat("$0.00");
    decimalFormat.setMinimumFractionDigits(2);
    
    try {
    
        double amount = Double.parseDouble("5.21");
        double tip_per = Double.parseDouble("20");
        double tip_cal = (amount * tip_per) / 100;
    
        double totalcost = amount + tip_cal;
    
        double rounded = (int)totalcost + 1;
    
        double roundtotal = rounded - totalcost;
    
        System.out.println("Tip Amount : " + decimalFormat.format((tip_cal)));
        System.out.println("Total Cost: " + decimalFormat.format(totalcost));
        System.out.println("Tip: " + decimalFormat.format(roundtotal) + " to round bill");
        System.out.println("Bill Tally: " + decimalFormat.format(totalcost + roundtotal));
    
    } catch (NumberFormatException e) {
        e.printStackTrace();
    }
    

    将输出...

    Tip Amount : $1.04
    Total Cost: $6.25
    Tip: $0.75 to round bill
    Bill Tally: $7.00
    

    说了这么多之后, doublefloat并不适合货币计算。 您可以使用longBigDecimal作为替代方案,例如...

    NumberFormat nf = NumberFormat.getCurrencyInstance();
    
    try {
    
        BigDecimal amount = new BigDecimal(Double.parseDouble("5.21"));
        BigDecimal tip_per = new BigDecimal(Double.parseDouble("20"));
    
        BigDecimal tip_cal = amount.multiply(tip_per).divide(new BigDecimal(100));
        BigDecimal totalcost = amount.add(tip_cal);
    
        BigDecimal rounded = totalcost.setScale(0, RoundingMode.CEILING);
        BigDecimal roundtotal = rounded.subtract(totalcost);
    
        System.out.println("Tip Amount : " + nf.format((tip_cal)));
        System.out.println("Total Cost: " + nf.format(totalcost));
        System.out.println("Tip: " + nf.format(roundtotal) + " to round bill");
        System.out.println("Bill Tally: " + nf.format(totalcost.add(roundtotal)));
    
    } catch (NumberFormatException e) {
        e.printStackTrace();
    }
    

    此示例使用NumberFormat类,而不是根据DecimalFormat创建自己的格式化程序,但不确定这是否可在Android中使用,但应考虑使用它(或等效项),因为它会考虑到本地用户

    链接地址: http://www.djcxy.com/p/85817.html

    上一篇: Rounding a Bill Total in Java

    下一篇: why is java turning integers into something less