2011-04-15 82 views
9

在java中,我試圖找到一種有效的方法來根據條件將BigDecimal舍入爲兩位小數,Up或Down。高效BigDecimal舍入到小數點後兩位

IF condition true then: 
    12.390 ---> 12.39 
    12.391 ---> 12.40 
    12.395 ---> 12.40 
    12.399 ---> 12.40 

If condition false then: 
    12.390 ---> 12.39 
    12.391 ---> 12.39 
    12.395 ---> 12.39 
    12.399 ---> 12.39 

什麼是最有效的方法來實現這一目標?

+0

你只是打算把它轉換成字符串或顯示它,或者你打算在其他一些使用它辦法? – 2011-04-15 20:17:15

+0

它被傳遞給採用BigDecimal的第三方庫方法。然後該庫將獲取該值並將其添加到字符串消息中。 – richs 2011-04-15 20:20:03

回答

25
public static BigDecimal round(BigDecimal d, int scale, boolean roundUp) { 
    int mode = (roundUp) ? BigDecimal.ROUND_UP : BigDecimal.ROUND_DOWN; 
    return d.setScale(scale, mode); 
} 
round(new BigDecimal("12.390"), 2, true); // => 12.39 
round(new BigDecimal("12.391"), 2, true); // => 12.40 
round(new BigDecimal("12.391"), 2, false); // => 12.39 
round(new BigDecimal("12.399"), 2, false); // => 12.39 
+7

模式應該是RoundingMode.FLOOR和RoundingMode.CEILING,而不是BigDecimal.ROUND_UP和BigDecimal.ROUND_DOWN。 – 2011-04-18 14:52:30

1
num = num.setScale(condition ? RoundingMode.UP : RoundingMode.DOWN); 

但是請注意,當涉及到負數的規範是不完全清楚。看看API doc中的各種舍入模式,看看你究竟需要什麼。

1

我建議以下(站在巨人的肩膀上......):

public BigDecimal roundNumber(final BigDecimal number, final boolean isFloor){ 
    return number.setScale(2, isFloor ? RoundingMode.FLOOR 
             : RoundingMode.CEILING); 
} 
相關問題