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

如何解决修剪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\"))));
    

解决方法

        检查一下
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位,但应根据需要显示)并不是一件容易的事,但是您可以接近: 将
stripTrailingZeros()
DecimalFormat
结合以得到所需的行为(或接近行为):
DecimalFormat df = new DecimalFormat(\"0.00########\")
String formatted = df.format(bigDecimal.stripTrailingZeros())
如果可以提高精度,它将格式化任何“ 5”值,该值应在小数点后至少2位,在小数点后最多10位。 小数点后超过10位的
BigDecimal
值仍将被截断:       输入|输出 ----------------- + ----------  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));
该代码将显示“ 9”。请注意,在需要四舍五入的情况下(即前两位数字后的任何数字都不为零),它将抛出“ 10”。 如果您的值可以具有更高的精度,并且您想应用一些舍入,只需将
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
。     ,        此方法将为您提供所需的结果(货币取舍): (什么是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);
    }
}
    ,        如果用于显示目的,请使用:
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);
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?