修剪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"))));

更新:拥有这些混合的需求(即小数点后至少应显示2位数字,但根据需要可以显示)并不是很容易实现的,但您可以接近:

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

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

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

小数点后超过10位的BigDecimal值仍将被截断:

输入|输出-----------------+----------1.20000 | 1.201.23000 | 1.231.2301 | 1.23011.230001000 | 1.23000112300000000001|1.23

原始答案:

如果你总是想在逗号后面有两个数字,并且知道这样不会失去精度,那么你可以调用setScale(2, RoundingMode.UNNECESSARY):

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

此代码将打印1.23。请注意,当需要舍入时(即前两位数字之后的任何数字都不为零),这将抛出ArithmeticException

如果您的值可以具有更高的精度,并且您希望应用一些舍入,只需将RoundingMode.UNNECESSARY替换为适当的值:

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

这将打印1.24

如果你不知道确切的数字数量,但想要尽可能少的数字(即你想要BigDecimal尽可能小的scale),那么调用stripTrailingZeros()将完全按照你的意愿进行:

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

这将打印1.230001

检查这个,

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));
  }
}  

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

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

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

要输出为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
  }
}
BigDecimal d = new BigDecimal("59.0000");
String d1 = new DecimalFormat().format(d);
System.out.println("d1 is " + d1);

最新更新