如何用科学记数法打印出来:
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(),但这对我来说似乎也不适用
答案 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):它在数字足够大或足够小时做指数表示法,但在它之间,它以纯十进制格式打印...