10

我正在尝试将浮点数四舍五入到小数点后 2 位。

我有 2 个浮点值:

1.985
29.294998

它们都需要四舍五入,所以我最终得到以下结果:

1.99
29.30

当我使用以下方法时:

public static Float precision(int decimalPlace, Float d) {

    BigDecimal bd = new BigDecimal(Float.toString(d));
    bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
    return bd.floatValue();
  }

结果是:

1.99
29.29
4

5 回答 5

11

由于您使用BigDecimal.ROUND_HALF_UP的是 ,29.294998因此四舍五入为29.29。您可能想BigDecimal.ROUND_UP改用。

检查BigDecimal 文档以获取有关每个可用舍入的更多信息。

于 2013-07-10T17:50:51.743 回答
3

而不是这个

bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);

采用

bd = bd.setScale(decimalPlace, BigDecimal.ROUND_CEILING);

关于 ROUND_CEILING

舍入模式向正无穷大舍入。如果 BigDecimal 为正,则与 ROUND_UP 一样;如果为负,则与 ROUND_DOWN 一样。请注意,此舍入模式永远不会减少计算值。

DecimalFormat如果你愿意,你可以使用。

于 2013-07-10T17:50:24.667 回答
3

由于您总是想四舍五入,因此您想要的根本不是BigDecimal.ROUND_HALF_UP,而是BigDecimal.ROUND_UPor BigDecimal.ROUND_CEILING

如果BigDecimal.ROUND_UP您希望负数向下舍入(-29.294998 到 -29.30),请使用。
如果BigDecimal.ROUND_CEILING您希望负数四舍五入(-29.294998 到 -29.29),请使用。

使用正数,他们都会做你想做的四舍五入(即四舍五入)

于 2013-07-10T17:50:51.947 回答
1

您正在使用ROUND_HALF_UP,当您应该使用ROUND_UP. ROUND_HALF_UP以给定的精度四舍五入到最接近的数字,四舍五入以打破平局(即 1.235 舍入到 1.24)

于 2013-07-10T17:50:54.413 回答
0

ROUND_HALP_UP

舍入模式向“最近的邻居”舍入,除非两个邻居是等距的,在这种情况下向上舍入。如果丢弃的分数 >= 0.5,则行为与 RoundingMode.UP 相同;否则,行为与 RoundingMode.DOWN 相同。请注意,这是学校通常教授的舍入模式。

完成的一项检查是被丢弃的余数 (2*4998) 的大小是否大于除数 (10000)。在这种情况下,它并没有决定更接近下端。如果您尝试 29.295001 ,则 ROUND_HALP_UP 将舍入为 29.3 。

于 2013-07-10T19:17:51.610 回答