2010-11-20 25 views
3
BigDecimal numerator = new BigDecimal(numerator); 
BigDecimal denominator = new BigDecimal(denominator); 
double result = numerator.divide(denominator).doubleValue(); 

在某些情况下除法结果为(e.g. 0.0060)。 在末尾(e.g 1.0)分开相等的数字会导致零。如何修剪BigDecimal除法结果

我宁愿在两种情况下修剪尾随零。我应该怎么做?

回答

3

如何将结果保持为BigDecimal,然后您可以将其设置为仅表示您想要的有效数字。

对于某些数字,一个简单的方法是使用BigDecimal#stripTrailingZeros()。但是,如果数字是一个尾随零的整数,则会得到一个工程表示,例如, 600.0会给你6E + 2。如果这不是您想要的,则必须检测此情况并手动使用BigDecimal#setScale()来适当设置缩放比例。

如果您需要保持限制的最大小数位数,则在应用此技术之前,需要使用其他格式化/舍入机制。

对于您要显示的值,而不是模型的内部值,仅对此进行此操作也是一个好主意。将其视为视图/表示层修改。

如果您必须转换为双精度型,那么它只是您可以改变的格式化表示。在这种情况下,如果你想要格式化的小数位数是可变的,我只需将它放入一个字符串/字符数组中,向后扫描第一个非零字符并在那里截断它。不是最高效的手段,但简单可靠。

您甚至可以使用regex达到此目的。

1

您可以使用DecimalFormat来做到这一点。例如:

DecimalFormat df = new DecimalFormat(".0"); 
double formatResult = df.format(result); 

如果结果为1.278494890,则会创建1.0的值。有可能在这里使用

1

好了许多可能的图案,让你有这样的代码:

BigDecimal numerator = new BigDecimal(numerator); 
BigDecimal denominator = new BigDecimal(denominator); 
double result = numerator.divide(denominator).doubleValue(); 

,你想要对输出的控制。由于结果是double,这是一个原始的,你不会有太多的控制。

从我的理解,你不想做任何舍入到n小数位,你想要原始精度与所需的格式配对。

你有几个选择。

BigDecimal numerator = new BigDecimal(numerator); 
BigDecimal denominator = new BigDecimal(denominator); 
BigDecimal div = numerator.divide(denominator); 

如果你留在BigDecimal,你的输出会更好。如果您将10作为上述代码的分子和分母,则System.out.println(div)将产生1

一般来说,要小心使用上面的代码,因为numeratordenominator一些组合将抛出

java.lang.ArithmeticException: "Non-terminating decimal expansion; no exact representable decimal result." 

如果你想避免这种情况,而不用担心超出两倍的内部表示精度,双直接使用。

System.out.println(2312/2.543); //909.1624066063704 
System.out.println(1.0/1.0); //1.0 
System.out.println(1/1);  //1 

当使用双号,你可能会在你的情况下,0末,如0.0060。如果你想确保你在说什么,你就必须使用

String dec = String.valueOf(10.0/10.0); //1.0 

,然后到你的结果转换为String使用

String newDec = dec.endsWith("0") ? dec.substring(0, dec.length() - 1) : dec; 

,以消除去年0。当然,如果您的字符串以.0结尾,您可以根据自己的喜好选择是否要离开那个领先的.