在BigDecimal中修剪两个以上的尾随零

时间:2011-05-30 11:58:49

标签: java bigdecimal

为BigDecimal

修剪两个以上尾随零的好方法

所以1.2200会打印1.22而1.0000会打印1.00

编辑以及返回1.222200 1.2222和1.220000001为1.220000001等。所以忽略前两个零我想修剪任何输入的0而不是修剪非零值

一种方法可以是乘法,然后应用内置修剪尾随零,然后除以100.这可能是角点情况的问题,但我的问题中的值是基于货币的,并且永远不会超过Java设置的边界(或者它意味着我的软件正在处理以美元计价的出价)

丑陋的解决方案如下:

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

6 个答案:

答案 0 :(得分:13)

更新:具有这些混合要求(即应显示小数点后至少2位数,但必要时尽可能多)仍然无法实现,但您可以接近:

stripTrailingZeros()DecimalFormat结合使用以获得所需的行为(或接近它):

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

这将格式化小数点后至少2位数的任何BigDecimal值,小数点后最多10位数,如果它提高了精度。

BigDecimal more 小数点后的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。请注意,当需要进行舍入时(即前2位数之后的任何内容都不为零),这将抛出ArithmeticException

如果您的值具有更高的精确度并且您想要应用某些舍入,只需将RoundingMode.UNNECESSARY替换为the appropriate value

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

这将打印1.24

如果您不知道确切的位数,但希望尽可能少(即您希望scale尽可能小BigDecimal},那么调用stripTrailingZeros()将完全正确你想要什么:

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

这将打印1.230001

答案 1 :(得分: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 :(得分:0)

此方法将为您提供所需的结果(货币回合): (什么是String,因为它对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);
    }
}

答案 3 :(得分:0)

如果用于显示目的,请使用:

BigDecimal d = new BigDecimal("1.2200");
NumberFormat n = NumberFormat.getCurrencyInstance(Locale.US);
String s = n.format(d.doubleValue());

答案 4 :(得分: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
  }
}

答案 5 :(得分:-1)

BigDecimal d = new BigDecimal("59.0000");
String d1 = new DecimalFormat().format(d);
System.out.println("d1 is " + d1);