具有正确格式的 BigDecimal 输出

BigDecimal output with correct format

请帮我设置 BigDecimal 的输出。例如: 我需要输出长度小于 8 位的数字,如下所示:“12345678”,如果大于则:“1,2345Å+9”。

方法

toPlainString();
toEngineeringString();
toString();

没有按预期工作:

 public class TestBigDecimalOutput {
        public static void main(String[] args) {

            BigDecimal d = new BigDecimal("57657657657453646587980887663654676580.24545346565476767645");
            String outPlainString = d.toPlainString();
            String outEngineeringString = d.toEngineeringString();
            String outString = d.toString();

            System.out.println(outPlainString);
            System.out.println(outEngineeringString);
            System.out.println(outString);
        }
    }

下面的代码产生下一个输出:

57657657657453646587980887663654676580.24545346565476767645 57657657657453646587980887663654676580.24545346565476767645 57657657657453646587980887663654676580.24545346565476767645

提示我做错了什么?

据我所知(但愿我是错的)您不能以特定方式进行 BigDecimal 渲染。没有办法(据我所知)让它使用科学或工程符号,或者控制它何时使用。工程符号将仅与数字 "needs an exponent," 一起使用,并且在 BigInteger.toString() 的文档中解释了需要指数的情况。坦率地说,我发现解释很难理解,而且我一直无法弄清楚如何使行为遵循应用程序中的有用模式。

我发现不尝试并自己格式化数字会更容易。这意味着以 10 为基数提取尾数和指数,然后将其连接为字符串,并在组件之间使用 "E"。尾数部分可能需要四舍五入。如果您知道指数(以 10 为底),则可以使用科学记数法从其大小计算出它是否超过您想要的阈值。如果没有,您可以只使用 BigDecimal.toPlainString(),或许可以进行适当的舍入。

工程符号可以用同样的方式处理,但指数四舍五入到最接近的三的倍数,尾数调整以补偿。

有一个有用的库 1 that can do the necessary logarithm and power operations, or see this question 2 可以提供一些建议。

我有一些代码可以做这些事情,我很乐意分享这些代码,但是包含它太长了,而且我不能保证它的生产质量,甚至可读性。