我在另一个类中创建了一个方法,用于计算用户投资后的金额。我试图让方法以标准格式而不是科学记数法返回值。我已经尝试查找同一主题的其他答案,这是我到目前为止所得到的
DecimalFormat df = new DecimalFormat("#.##");
df.setMaximumFractionDigits(0);
endofyearamount = Double.valueOf(df.format(endofyearamount));
return endofyearamount;
然而,当我运行main方法时,我仍然得到
的值 1.2902498E7
这是我的main方法中的代码,用于显示返回值,以防您需要查看它。
double answer = formula.calculate(age, retiredage, monthlyinvestment, interestrate, investedperyear, endofyearamount, x, y );
System.out.println(answer);
答案 0 :(得分:1)
从不使用double
,而是在使用Java代表资金时使用BigDecimal
。 Floating points cannot be used to represent precise real numbers accurately
在另一个问题上看到我的回复comment。
答案 1 :(得分:1)
首先,你不应该依赖浮动数字存储货币信息,因为它们的行为并不像你期望的那样。
第二件事是:科学表征只是一种写作价值的方式。价值不能是科学的或不科学的,因为它只是一个价值。我的意思是,没有办法将double
转换为非特定的表示,而只是以非科学的方式打印其值。
无论您想如何打印它,double
的值都是相同的。您可以通过忽略一些十进制值来打印它(并获得相应的舍入),但在您的情况下,您只是在做什么?将其转换为字符串以检索新值以引入新错误?
答案 2 :(得分:1)
我认为endofyearamount
是double
,这意味着您返回的浮点数不是字符串。在转动它之前摆弄双倍的任何数量都不会导致改变System.out.println(answer)
调用所做的格式化。而是使用
System.out.println(String.format("%.2f", answer));
答案 3 :(得分:1)
你不想在涉及金钱的计算中使用双数浮点数。
一种简单的方法是使用美分作为单位,而不是美元,并将金额(以美分为单位)存储在整数中(或长期存入大笔金额)。
举个例子:
public String centsToString(int cents) {
int dollars = cents / 100;
cents = cents - (dollars * 100);
if (cents < 10) return "$" + dollars + "." + cents + "0";
return "$" + dollars + "." + cents;
}
测试:
System.out.println(new TestAutoTagger().centsToString(13));
System.out.println(new TestAutoTagger().centsToString(99));
System.out.println(new TestAutoTagger().centsToString(100));
System.out.println(new TestAutoTagger().centsToString(101));
System.out.println(new TestAutoTagger().centsToString(999901));
产生
$ 0.13
$ 0.99
$ 1.00包装
$ 1.10
$ 9999.10