【问题标题】:Java `NumberFormat` assumes incorrect number typeJava `NumberFormat` 假定数字类型不正确
【发布时间】:2019-02-06 18:45:22
【问题描述】:

例如:

NumberFormat nf = NumberFormat.newInstace();
Number number = nf.parse("0.0");

number 在运行时被解析为java.lang.Integer,尽管很明显该值为Double。 大多数时候这不是问题,因为无论如何该值都包含在Number 中,但问题是Number 没有实现Comparable,我不得不求助于转换它。

是否有一个类假定类似于"0.0" 的字符串来表示Double

【问题讨论】:

  • 如果您要解析的数字是双精度数,为什么不将它们解析为双精度数:Double.parseDouble(numberAsString)

标签: java string string-formatting number-formatting


【解决方案1】:

Numberformat 了解您所在地区的数字书写方式。例如在意大利你有“,”作为小数点。所以:

     NumberFormat nf =  NumberFormat.getInstance(Locale.ITALY);
     Number number = nf.parse("0,1");
     System.err.println(number);  

0.1

如果你使用了“.”仅用于创建组(例如数千个),您将得到 1 作为结果(正确,因为 01 是 1):

     NumberFormat nf =  NumberFormat.getInstance(Locale.ITALY);
     Number number = nf.parse("0.1");
     System.err.println(number);  

1

现在英语语言环境正好相反:

        NumberFormat nf =  NumberFormat.getInstance(Locale.ENGLISH);
        Number number = nf.parse("0.1");
        System.err.println(number);

0.1

最后是带有“,”的英文:

        NumberFormat nf =  NumberFormat.getInstance(Locale.ENGLISH);
        Number number = nf.parse("0,1");
        System.err.println(number);

1

有人争论尾随 0。所以:

   NumberFormat nf =  NumberFormat.getInstance(Locale.ENGLISH);
   double d = nf.parse("17").doubleValue();
   double d2 = nf.parse("17.000").doubleValue();

d 和 d2 将具有相同的值。这与我在代码中分配变量的行为完全相同。

   double d = 17;
   double d2 = 17.000;

两个变量将包含相同的数字。在这两种情况下都不会损失精度。

比较也会正确返回true:

   boolean test = nf.parse("17") == nf.parse("17.000");
   System.err.print( test );

是的

这与代码中的行为相同:

   boolean test = 17 == 17.000;
   System.err.print( test );

是的

最后,NumberFormat 的返回类型是“数字”。它将一个数字解析为:一个数字。所以这既不是 Double 也不是 Long (就像 Animal 既不是 Dog 也不是 Cat,即使 Dog 是 Animal )。

如果您需要可靠的双精度,只需使用 number.doubleValue() 即可可靠地为您提供所需的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    相关资源
    最近更新 更多