舍入一个双倍到2dp

时间:2012-09-30 13:05:42

标签: java decimal

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

我有方法:

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

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

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

我收到一个错误,告诉我预计会出现“双重”,但发现了“字符串”。

有关如何解决此问题的任何建议吗?

谢谢!

3 个答案:

答案 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构造函数。

查看相关问题herehere

答案 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中类似计算的结果发表评论。