我目前正在尝试编写一个程序,将“双”变量四舍五入到两位小数。
我有方法:
DecimalFormat df = new DecimalFormat("#.00");
但是,当我应用该方法时:
double x = df.format(y-z);
我收到一个错误,告诉我预计会出现“双重”,但发现了“字符串”。
有关如何解决此问题的任何建议吗?
谢谢!
答案 0 :(得分:1)
试试这个
@Test
public void test() {
int f = 100;
double d = 123.456;
double temp = d * f;
double rounded = Math.round(temp);
double to2dp = rounded / f;
Assert.assertEquals(123.46, to2dp, 0.00001);
}
f = 100来自2dp。您将使用f = 10表示1dp等
答案 1 :(得分:0)
如果您使用双打来存储/计算货币值,那么您可能会发现自己陷入了四舍五入的痛苦世界。在那里,做到了,得到了伤疤。
我强烈建议您对所有货币值使用BigDecimal
值,甚至在实例化中不涉及双精度数。始终使用String
构造函数。
答案 2 :(得分:0)
在对我的另一个答案的评论中,Gary Rowe建议使用Joda Money作为解决方案。
现在虽然这可能是一个很好的产品,但我必须承认我没有尝试过,我对他们的文档中的以下示例有点担心:
// multiplies by 3.5 with rounding
money = money.multipliedBy(3.5d, RoundingMode.DOWN);
现在这是一个有趣的例子,因为他们使用了一个双精度数,可以用双精度精确表示。
为了说明这一点,我们以下面的单元测试为例:
double d1 = 3.5d;
BigDecimal bd1 = new BigDecimal(d1);
System.out.println("BD version of " + d1 + " = " + bd1);
BigDecimal bd2 = new BigDecimal("10000000");
BigDecimal bd3 = bd2.multiply(bd1);
System.out.println("Result in bd3 = " + bd3);
这会产生以下输出:
BD version of 3.5 = 3.5
Result in bd3 = 35000000.0
但是,如果将“3.5d”更改为“3.4d”,则会得到截然不同的结果:
BD version of 3.4 = 3.399999999999999911182158029987476766109466552734375
Result in bd3 = 33999999.999999999111821580299874767661094665527343750000000
现在Joda Money课程可以处理这个问题(不知何故),但在混合中引入任何双精度数字都充满了危险。
Gary,也许你可以对Joda Money中类似计算的结果发表评论。