我有以下函数,用于在Java中对双精度值进行舍入:
public static double round(double d, int decimalPlace) {
BigDecimal bd = new BigDecimal(Double.toString(d));
bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
return bd.doubleValue();
}作为输入,此函数接收以下值:
double d = 7.3149999999999995;
int decimalPlace = 2但是,当函数返回时,返回的值是7.31,而不是7.32。我在文档中搜索,看看为什么bd.SetScale会有这种行为,但没有成功。
有人能解释一下为什么会发生这种情况吗?非常感谢!
发布于 2012-09-29 01:39:54
有人能解释一下为什么会发生这种情况吗?
它遵循the docs中记录的行为:)
如果通过操作缩小了刻度,则必须对未缩放值进行除法(而不是乘法),并且可以更改该值;在这种情况下,指定的舍入模式将应用于除法。
而对于RoundingMode.HALF_UP
舍入模式向“最近邻居”舍入,除非两个邻居的距离相等,在这种情况下会向上舍入。
现在7.3149999999999995与7.31和7.32的距离不相等--它更接近7.31,所以这就是结果。
只有当原始值恰好为7.315时,才会看到HALF_UP和HALF_DOWN之间的差异,即两者之间的一半。
顺便说一句,为了确保你得到的是你想要的数字,我建议你使用String。例如:
double d = 0.1;
BigDecimal bd = new BigDecimal(d);不同于:
BigDecimal bd = new BigDecimal("0.1");从double到BigDecimal的转换通常是错误的标志,您应该始终使用一种类型。
发布于 2012-09-29 01:40:22
ROUND_HALF_UP:舍入模式向“最近的邻居”取整,除非两个邻居的距离相等,在这种情况下会向上取整。
在您的示例中,最近的邻居是7.31,因为7.314中的4比10更接近0。要证明这一点,请更改7.314...到7.315....
查看不同的舍入模式,以提供所需的行为。
https://stackoverflow.com/questions/12644715
复制相似问题