我正在尝试将浮点数舍入到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
答案 0 :(得分:11)
由于您使用的是BigDecimal.ROUND_HALF_UP
,因此29.294998
四舍五入为29.29
。您可能希望改为使用BigDecimal.ROUND_UP
。
检查BigDecimal doc以获取有关每次舍入的更多信息。
答案 1 :(得分:3)
而不是这个
bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
使用
bd = bd.setScale(decimalPlace, BigDecimal.ROUND_CEILING);
关于ROUND_CEILING
舍入模式向正无穷大舍入。如果BigDecimal是 正面,表现为ROUND_UP;如果是否定的,则表现为 ROUND_DOWN。请注意,此舍入模式永远不会减少 计算值。
如果需要,您可以使用DecimalFormat
。
答案 2 :(得分:3)
由于您总是想要整理,但您想要的不是BigDecimal.ROUND_HALF_UP
,而是BigDecimal.ROUND_UP
或BigDecimal.ROUND_CEILING
。
如果您希望将否定数字向下舍入(-29.294998至-29.30),请使用BigDecimal.ROUND_UP
。
如果您希望否定数字向上舍入(-29.294998到-29.29),请使用BigDecimal.ROUND_CEILING
。
对于正数,他们都会进行你正在尝试的舍入(即向上舍入)
答案 3 :(得分:1)
当您使用ROUND_HALF_UP
时,您正在使用ROUND_UP
。 ROUND_HALF_UP
以给定精度舍入到最接近的数字,向上舍入以打破关系(即1.235轮到1.24)
答案 4 :(得分:0)
ROUND_HALP_UP
舍入模式向“最近邻居”舍入,除非两个邻居都是等距的,在这种情况下向上舍入。如果丢弃的分数> = 0.5,则表现为RoundingMode.UP;否则,表现为RoundingMode.DOWN。请注意,这是学校通常教授的舍入模式。
所做的一项检查是,剩余量的下降(2 * 4998)大于除数(10000)。在这种情况下,并不是因此确定它更靠近下端。如果您尝试将29.295001舍入到ROUND_HALP_UP的29.3。