我目前正在尝试编写一个将“双”变量四舍五入到小数点后两位的程序。
我有方法:
DecimalFormat df = new DecimalFormat("#.00");
但是,当我应用该方法时:
double x = df.format(y-z);
我收到一个错误,告诉我应该是“双”,但找到了一个“字符串”。
关于如何解决这个问题的任何建议?
谢谢!
试试这个
@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 等
在对我的其他答案的评论中,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 中类似计算的结果。