以Java总计账单
这个问题在这里已经有了答案:
查看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
说了这么多之后, double
和float
并不适合货币计算。 您可以使用long
或BigDecimal
作为替代方案,例如...
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中使用,但应考虑使用它(或等效项),因为它会考虑到本地用户