BigDecimal numerator = new BigDecimal(numerator);
BigDecimal denominator = new BigDecimal(denominator);
double result = numerator.divide(denominator).doubleValue();
在某些条件下进行划分会导致最后为(e.g. 0.0060)
的零。
除以相等的数字会导致末尾为零(e.g 1.0)
。
我更愿意在两种情况下修剪尾随零。我该怎么做?
答案 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
。
一般情况下,请注意使用上述代码,因为numerator
和denominator
的某些组合会抛出
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
结尾,则您可以根据自己的偏好选择是否要保留该.
。