DecimalFormat - 格式十进制以保留可变数量的尾随零

时间:2017-10-26 18:47:45

标签: java double bigdecimal decimalformat

我有一种情况,我需要在使用DecimalFormat格式化为String时保留数字的小数位数,特别是对于尾随零。我需要使用DecimalFormat,因为我还需要避免使用大数字的科学记数法,并且如here所示,这是最好的方法。但是,正如您在该帖子中看到的那样,提供的代码也会删除尾随零,而我想保留它们。

1.00 -> "1.00"
1.000 -> "1.000"

我看过很多涉及固定小数位数的问题,但在我的情况下,我需要考虑可变的小数位数。我查看了计算小数位数,但由于我的输入也可以是Double(除了BigDecimal),似乎没有可靠的方法来计算所有数字小数点后的数字。 Double.toString()不起作用,因为双打分为非常小和非常大的数字的指数表示法。有关为何难以计算双精度小数位数的详细信息,请参阅here

2 个答案:

答案 0 :(得分:3)

"保留"尾随零?

double 值并不知道您想要查看多少尾随零。它只是数字1.001.000是相同的数字,即数字1。您要求无法使用double 值。

现在, BigDecimal 会记住尾随零的数量,因此如果您要打印BigDecimal值,请保留该数字的比例,但确保它永远不会用科学记数法打印,不要使用DecimalFormat,而是使用toPlainString()

  

返回此BigDecimal 的字符串表示形式,不带指数字段

<强>更新

如果要根据需要打印带有尽可能多的小数位数的double值(即没有尾随零),并且想要确保它永远不会以科学记数法打印,请使用DecimalFormat非常高的MaximumIntegerDigits和非常高的setMaximumFractionDigits

&#34;非常高&#34;表示超出double范围的值,因此999是一个好的&#34; round&#34;数字虽然330足够高。

测试

DecimalFormat fmt = new DecimalFormat("0");
fmt.setMaximumIntegerDigits(330);
fmt.setMaximumFractionDigits(330);

System.out.println("0.0123400  = " + 0.0123400               + "   = " + fmt.format(0.0123400));
System.out.println("123400.00  = " + 123400.00                + "  = " + fmt.format(123400.00));
System.out.println("NaN        = " + Double.NaN          + "       = " + fmt.format(Double.NaN));
System.out.println("-INFINITY  = " + Double.NEGATIVE_INFINITY  + " = " + fmt.format(Double.NEGATIVE_INFINITY));
System.out.println("+INFINITY  = " + Double.POSITIVE_INFINITY + "  = " + fmt.format(Double.POSITIVE_INFINITY));
System.out.println("MIN_NORMAL = " + Double.MIN_NORMAL               + " = " + fmt.format(Double.MIN_NORMAL));
System.out.println("MIN_VALUE  = " + Double.MIN_VALUE + "                = " + fmt.format(Double.MIN_VALUE));
System.out.println("MAX_VALUE  = " + Double.MAX_VALUE               + "  = " + fmt.format(Double.MAX_VALUE));

输出

0.0123400  = 0.01234   = 0.01234
123400.00  = 123400.0  = 123400
NaN        = NaN       = �
-INFINITY  = -Infinity = -∞
+INFINITY  = Infinity  = ∞
MIN_NORMAL = 2.2250738585072014E-308 = 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072014
MIN_VALUE  = 4.9E-324                = 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049
MAX_VALUE  = 1.7976931348623157E308  = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

答案 1 :(得分:0)

double(无精度,总是近似值)或BigDecimal

使用BigDecimal作为new BigDecimal("2.00")定义两位数的正确比例(精度)。您可以通过编程方式设置比例。

对于数据库和计算(如财务),BigDecimal很好。

BigDecimal.toPlainString()可以避免对输出的科学表示。

对于double,可以使用

进行格式化
s = String.format("%10.2f", 13.5789); // "   13.58"

所有这些都是小数点,没有千位分隔符。

国际化(本地化)软件将使用带有区域设置的MessageFormat(显式或默认平台区域设置)。

Locale.setDefault(new Locale("bg", "BG"));
s = MessageFormat.format("Number: {0, number, #.##}, "
            + "amount: {1, number, currency}",
            42.125, 19.99);