你如何削减BigDecimal分区结果

时间:2010-11-20 07:06:18

标签: java

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

在某些条件下进行划分会导致最后为(e.g. 0.0060)的零。 除以相等的数字会导致末尾为零(e.g 1.0)

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

您甚至可以使用regex来实现此目的。

答案 1 :(得分:1)

您可以使用DecimalFormat执行此操作。类似的东西:

DecimalFormat df = new DecimalFormat(".0");
double formatResult = df.format(result);
如果结果是1.278494890,

将创建1.0。这里可以使用许多可能的模式

答案 2 :(得分: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."

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

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
String dec = String.valueOf(10.0/10.0); //1.0

然后使用

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

根除最后0。当然,如果您的字符串以.0结尾,则您可以根据自己的偏好选择是否要保留该.