1

我目前正在尝试编写一个将“双”变量四舍五入到小数点后两位的程序。

我有方法:

DecimalFormat df = new DecimalFormat("#.00");

但是,当我应用该方法时:

double x = df.format(y-z);

我收到一个错误,告诉我应该是“双”,但找到了一个“字符串”。

关于如何解决这个问题的任何建议?

谢谢!

4

3 回答 3

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 等

于 2012-09-30T13:07:24.773 回答
0

如果您使用双精度数来存储/计算货币价值,那么您可能会发现自己陷入了四舍五入的痛苦世界。去过那里,做过,有伤痕。

我强烈建议您使用所有BigDecimal货币值的值,甚至不要在实例化中涉及双精度值。始终使用构造函数。String

请在此处此处查看相关问题。

于 2012-11-26T20:24:55.093 回答
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 中类似计算的结果。

于 2013-02-25T01:30:29.823 回答