具有正确格式的 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 可以提供一些建议。
我有一些代码可以做这些事情,我很乐意分享这些代码,但是包含它太长了,而且我不能保证它的生产质量,甚至可读性。
请帮我设置 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 可以提供一些建议。
我有一些代码可以做这些事情,我很乐意分享这些代码,但是包含它太长了,而且我不能保证它的生产质量,甚至可读性。