2011-05-30 53 views
6

什麼會削減兩個以上的尾隨零爲一個BigDecimal修剪兩個以上的尾隨零的BigDecimal的

因此1.2200將打印1.22和1.0000將打印1.00

編輯除了作爲一個很好的方法返回1.222200作爲 1.2222和1.220000001爲1.220000001等,所以不考慮前兩個零我要修剪任何輸入0,而不是修剪非零值

的一種方式可能是大量繁殖,然後應用內置的裝飾尾隨零,然後除以100。這可能是有角的情況下的問題,但在我的問題的價值是基於貨幣,並永遠不會超過由Java設置的界限(否則這意味着我的軟件正在處理價格gazzilions美元)

醜陋的解決方案作爲folows

System.out.println(((new BigDecimal("1.230223000") 
           .multiply(new BigDecimal("100.0")) 
           .stripTrailingZeros()).divide(new BigDecimal("100.0")))); 
+0

注意到你原來的那些新的要求相沖突:如何'1.230223000'變成'1.230223',但'1.0000'應打印'1.00'? – 2011-05-30 13:05:33

+0

不,他們不是約阿希姆。再讀一遍。我想忽略小數點後的前兩個零來進行修整。而輸入將永遠是至少x.xx類型 – geoaxis 2011-05-30 13:52:08

+0

是的,我意識到後,我發表了我的評論。我的(更新的)答案有幫助嗎? – 2011-05-30 13:52:56

回答

8

檢查這一點,

import java.text.DecimalFormat; 
import java.text.NumberFormat; 

public class DecimalFormatExample 
{ 
    public static void main(String args[]) 
    { 
    double amount = 2192.015; 
    NumberFormat formatter = new DecimalFormat("#0.00"); 
    System.out.println("The Decimal Value is:"+formatter.format(amount)); 
    } 
} 
+2

這將截斷新的BigDecimal(「1.234」),該新的BigDecimal(根據新的要求)應該完整地打印。 – 2011-05-30 13:50:01

13

更新:有了這些混合要求(即小數點後至少2個數字應顯示,但多達必要)不平凡實現,但你可以接近:

結合stripTrailingZeros()DecimalFormat以獲得所需的行爲(或接近):

DecimalFormat df = new DecimalFormat("0.00########") 
String formatted = df.format(bigDecimal.stripTrailingZeros()) 

這將格式化任何BigDecimal值,小數點後至少2位數字,小數點後最多10位數字,如果它提高了精度。

BigDecimal比小數點後10個位數的值仍然會被切斷:

 
     input  | output 
-----------------+---------- 
1.20000   | 1.20 
1.23000   | 1.23 
1.2301   | 1.2301 
1.230001000  | 1.230001 
1.2300000000001 | 1.23 

原來的答覆:

如果你總是希望有確切2數字後的逗號,並知道你不會失去這種精度,那麼你可以撥打setScale(2, RoundingMode.UNNECESSARY)

System.out.println(new BigDecimal("1.23000").setScale(2, RoundingMode.UNNECESSARY)); 

此代碼將打印1.23。請注意,如果需要四捨五入,這將產生一個ArithmeticException(即前兩位數字不爲零後的任何值)。

如果你的價值觀可以有較高的精度,要應用某些圓整,只需用the appropriate value替換RoundingMode.UNNECESSARY

System.out.println(new BigDecimal("1.2301").setScale(2, RoundingMode.CEILING)); 

這將打印1.24

如果你不知道數字的確切人數,但要儘量少(即你想要儘可能小scaleBigDecimal)然後調用stripTrailingZeros()會做你想要什麼:

System.out.println(new BigDecimal("1.230001000").stripTrailingZeros(); 

這將打印1.230001

+0

注意:我的答案假定您需要*值*。如果您*只*要格式化該值的顯示方式,則@Max的回答更爲合適。 – 2011-05-30 12:08:55

+0

我確實需要這個值,而且我也希望它適用於以下情況BigDecimal 1.230002000000返回BigDecimal 1.230002 – geoaxis 2011-05-30 12:30:09

+0

@geoaxis:我已經更新了我對這些更改的要求的回答。 – 2011-05-30 13:04:28

0

這種方法會給你你想要的結果(貨幣圓): (什麼是字符串,因爲它是更好地爲BigDecimal的見文檔)

public static float roundUp(String what, int howmuch) throws Exception{ 

    try { 
     return (new BigDecimal(what).setScale(howmuch, BigDecimal.ROUND_UP)).floatValue(); 
    } catch (NumberFormatException nfe) { 
     throw new Exception("BigDecimal cannot parse value : " + what, nfe); 
    } 
} 
0

如果它是用於展示用途:

BigDecimal d = new BigDecimal("1.2200"); 
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US); 
String s = n.format(d.doubleValue()); 
-1
BigDecimal d = new BigDecimal("59.0000"); 
String d1 = new DecimalFormat().format(d); 
System.out.println("d1 is " + d1); 
+0

這個答案已經發布了,不屬於「西部最快槍」的範圍, – Woot4Moo 2012-10-21 15:07:17

0

輸出爲String,請使用DecimalFormat

否則,使用此:

public static BigDecimal stripToMinimumScale(BigDecimal value, 
              final int minimumScale) { 
    if (value.scale() == minimumScale) // Already correct scale 
    return value; 
    else { 
    value = value.stripTrailingZeros(); 
    return (value.scale() < minimumScale) ? 
     value.setScale(minimumScale) : // Too few decimals, needs zero pad 
     value; // Do not round any significant digits 
    } 
}