Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在BigDecimal中修剪两个以上的尾随零_Java_Bigdecimal - Fatal编程技术网

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

Java 在BigDecimal中修剪两个以上的尾随零,java,bigdecimal,Java,Bigdecimal,对于一个BigDecimal,修剪两个以上尾随零的好方法是什么 因此1.2200将打印1.22,1.0000将打印1.00 编辑并返回1.222200作为 1.2222和1.220000001作为1.220000001等。因此,不考虑前两个零,我希望修剪任何传入的0,而不是修剪非零值 一种方法是相乘,然后应用内置的微调尾随零,然后除以100。在角落案例中可能会出现问题,但我的问题中的值是基于货币的,并且永远不会超过Java设置的界限(或者它意味着我的软件正在处理以美元为单位的投标) 丑陋的解决办

对于一个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
组合以获得所需的行为(或接近该行为):

这将格式化任何
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 此代码将打印
1.23
。请注意,当需要舍入时(即前两位之后的任何数字都不是零),这将抛出一个

如果您的值可以具有更高的精度,并且希望应用一些舍入,只需将
舍入模式。不必要的
替换为:

这将打印
1.24

如果您不知道确切的位数,但希望位数尽可能少(即您希望
BigDecimal
scale
尽可能小),则调用将完全满足您的要求:

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请参阅文档)


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

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

要输出为
字符串
,请使用
十进制格式

否则,请使用以下命令:

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 stripToMinimumScale(BigDecimal值,
最终整数(最小刻度){
如果(value.scale()==minimumScale)//比例已正确
返回值;
否则{
value=value.stripTrailingZeros();
返回值(value.scale()
注意:我的回答假设您需要该值。如果您只想格式化值的显示方式,那么@Max的答案更合适。我确实需要该值,我还想让它对以下情况起作用:BigDecimal 1.23000200000返回BigDecimal 1。230002@geoaxis:我已更新了这些更改需求的答案。请注意,您的新需求与原始需求冲突:
1.230223000
如何才能转换为
1.230223
,但是
1.0000
应该打印
1.00
?不,他们没有。再读一遍。我想忽略小数点后的前两个零进行修剪。而且输入的内容将始终至少是x.xx类型是的,我在发布我的评论后意识到了这一点。我的(更新的)答案有帮助吗?这将截断新的BigDecimal(“1.234”)
,根据新的要求,应该全部打印。这个答案已经发布,不属于“西方最快的枪”的范围
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));
  }
}  
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());
BigDecimal d = new BigDecimal("59.0000");
String d1 = new DecimalFormat().format(d);
System.out.println("d1 is " + d1);
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
  }
}