【问题标题】:Why pattern "33333.##" acts so strange when we use the DecimalFormat method .format()?为什么当我们使用 DecimalFormat 方法 .format() 时,模式“33333.##”表现得如此奇怪?
【发布时间】:2017-09-30 10:01:07
【问题描述】:

昨天我尝试自己探索 DecimalFormat 方法 .format() 及其所有占位符的行为以及它们的作用。
所以我写了两个数字并尝试了不同的模式。使用“#.##”,所有不重要的零都被删除,使用“0000.00”,该方法在数字前面添加前导零。没关系,但后来我尝试了一些奇怪的模式,看看会发生什么。
使用模式“33333.##”,最终输出真的很奇怪。您可以在下面看到我的代码:

DecimalFormat df = new DecimalFormat("33332.##");
double a= 222.46705219;
double b=-102.000;

System.out.println(df.format(a));
System.out.println(df.format(b));

它的输出是:

 33332222,47
-33332102,0   

与数字相同的输入,但使用模式“33033.##”给出结果:

33222,4732
33102

我知道程序在 0 的位置添加了格式化数字,但是为什么当零不作为占位符显示时,该方法仍然舍入第一个数字和(显然)第二个数字?
为什么我的第一个数字被舍入到它的第二个数字,但第二个数字 (b) 在末尾打印了一个零?
为什么当 0 占位符出现在“33033.##”程序的中间时在其位置插入格式化的数字 a 但不在数字 b 的末尾打印“33”?
我真的不知道如何解释这种行为。

【问题讨论】:

    标签: java formatting decimalformat


    【解决方案1】:

    documentation 突出显示了您应该设置的模式的清晰语法。您的两种格式都违反了所需的语法,因此您的发现不应被视为可靠,并且可能会在未来的版本中发生变化。坦率地说,我很惊讶构造函数在这些格式下没有抛出异常。

    33332.##33332 被视为前缀,其余部分 .## 无效,因为在小数点前需要 0#

    33033.##33 被视为前缀,留下033.##。鉴于0.# 不能是任何前缀或后缀的一部分,而3 只能是前缀或后缀的一部分,此模式无效。

    【讨论】:

    • 是的,我知道它们是无效的,但这并不能解释为什么每种模式对待数字 a 的方式都不同于数字 b。查看示例 - 为什么模式“33332.##”打印“a”格式为小数点分隔符后的第二位,但“b”格式为第一个?
    • 我想说的是,因为它是无效的,所以结果是不可预测的。这可能有多种原因,没有理由相信它不会在没有警告的情况下改变。
    猜你喜欢
    • 1970-01-01
    • 2018-07-21
    • 2011-07-08
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多