Java舍入双截断零

时间:2017-05-02 13:00:30

标签: java

我有以下逻辑,将double值舍入到2位小数:

public double round(double value, int places) {
        BigDecimal bd = new BigDecimal(value);
        bd = bd.setScale(places, RoundingMode.HALF_UP);
        return bd.doubleValue();    
}

它适用于大多数情况,但在某些情况下无法将结果舍入到2位小数,下面就是一个例子。

如果我使用代码round(12.503, 2)调用此方法,我需要将结果作为12.50,因为我需要2个小数位的结果,但我得到的输出为12.5

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:4)

Java中的double表示一个数学数字,其中12.50与12.5相同。显示一个数字的位数是将其转换为字符串而不是数字本身的问题。

当您将数字转换为输出字符串时,最好进行舍入,例如:

nl_func_decl_start

答案 1 :(得分:2)

将结果显示为12.5

你收到了双倍的回报。

然后,你选择了一些显示双精度的任意方法(你没有告诉过我们),并根据应用该方法的结果,你认为它的值为{{ 1}}。

你看,双打的是它们不能被认为具有固定数量的十进制数字。 (或者,更确切地说,他们拥有的十进制数字是如此巨大,以至于没有人想要全部看到它们。)所以,很可能你收到的双倍的实际值,没有任何偏见通过各种显示方法引入,类似于12.5000000 ...但你需要选择正确的方法来显示它,以便看到它是什么。如果您选择的方法只是删除尾随零,那么您可能会留下缺少尾随零的印象。或者10个尾随零。

因此,您需要将其转换回12.5,然后才能对您获得的结果做出任何假设。