0

我如何以科学计数法打印:

BigDecimal r= (a.subtract(exact, MathContext.DECIMAL128)).divide(exact, MathContext.DECIMAL128).stripTrailingZeros();
DecimalFormat format = new DecimalFormat("0.###E0");
System.out.println(new BigDecimal(format.format(r));

在哪里:

a = 1.111111111111111160454356650006957352161407470703125
exact = 0.11

返回:

r = 0.900010000000000004

有任何想法吗?我也试过在 BigDecimal 上调用 EngineeringString() 但这似乎对我不起作用

4

1 回答 1

4

你做的太过分了。你只需要:

System.out.println(format.format(r));

DecimalFormat对象确实创建了一个字符串,再次创建BigDecimal实例只会再次解析字符串中的数字 - 并且在 BigDecimal 实例上调用 toString() 方法,产生您描述的输出......

一些澄清

BigDecimal,以及其他数字格式(还有日期!)以二进制格式存储在内存中,从我们人类对它们的看法中抽象出来。BigDecimal例如存储小数位数,以及小数点在哪里。浮点数更加复杂。 Date存储来自The Epoch的秒数。您需要将它们格式化为可读。格式化意味着创建一个字符串(或语义相似的)对象,该对象以所需格式表示给定对象的值。这不涉及以任何方式更改原始对象。

默认格式 toString() 提供了一种通用格式。以您想要的方式获得输出并不意味着使用 toString() 更改要格式化的值,而是将未更改的值转换为正确的字符串。很好的例子是 Double.toString()(使用 sun.mic.FloatingDecimal):当数字足够大或足够小时,它会使用指数表示法,但在两者之间,它会以纯十进制格式打印...

于 2013-09-12T14:18:13.343 回答