如何以科学计数法打印此内容:

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

最佳答案

你把这件事夸大了。您唯一需要的是:

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


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

一些澄清

BigDecimal和其他数字格式(以及日期!)也以二进制格式存储在内存中,这是人类对它们的抽象。例如,BigDecimal存储十进制数字以及小数点所在的位置。 Floating point numbers are even more sophisticated. Date存储The Epoch中的秒数。您需要格式化它们以使其可读。格式化是指创建一个String(或语义类似)对象,该对象以所需格式表示给定对象的值。这不涉及以任何方式更改原始对象。

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

关于java - 将BigDecimal转换为科学计数法Java,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18766595/

10-11 22:28
查看更多