我有以下逻辑,将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
请帮我解决这个问题。
答案 0 :(得分:4)
Java中的double表示一个数学数字,其中12.50与12.5相同。显示一个数字的位数是将其转换为字符串而不是数字本身的问题。
当您将数字转换为输出字符串时,最好进行舍入,例如:
nl_func_decl_start
答案 1 :(得分:2)
您 不 将结果显示为12.5
。
你收到了双倍的回报。
然后,你选择了一些显示双精度的任意方法(你没有告诉过我们),并根据应用该方法的结果,你认为它的值为{{ 1}}。
你看,双打的是它们不能被认为具有固定数量的十进制数字。 (或者,更确切地说,他们拥有的十进制数字是如此巨大,以至于没有人想要全部看到它们。)所以,很可能你收到的双倍的实际值,没有任何偏见通过各种显示方法引入,类似于12.5000000 ...但你需要选择正确的方法来显示它,以便看到它是什么。如果您选择的方法只是删除尾随零,那么您可能会留下缺少尾随零的印象。或者10个尾随零。
因此,您需要将其转换回12.5
,然后才能对您获得的结果做出任何假设。