将BigDecimal转换为Scientific Notation Java

时间:2013-09-12 14:10:13

标签: java

如何用科学记数法打印出来:

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(),但这对我来说似乎也不适用

1 个答案:

答案 0 :(得分:4)

你太过分了。你只需要:

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

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

一些澄清

BigDecimal和其他数字格式(以及日期!)以二进制格式存储在内存中,从人类对它们的看法中抽象出来。例如BigDecimal存储小数位数,小数点位于何处。 Floating point numbers are even more sophisticated. Date存储The Epoch的秒数。您需要格式化它们才能读取。格式化意味着创建一个String(或语义相似)对象,它以所需格式表示给定对象的值。这不涉及以任何方式更改原始对象。

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