Java `NumberFormat` 假定数字类型不正确

Posted

技术标签:

【中文标题】Java `NumberFormat` 假定数字类型不正确【英文标题】:Java `NumberFormat` assumes incorrect number type 【发布时间】: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) 【参考方案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() 即可可靠地为您提供所需的类型。

【讨论】:

以上是关于Java `NumberFormat` 假定数字类型不正确的主要内容,如果未能解决你的问题,请参考以下文章

java求两个数百分比,精确到指定位数

NumberFormat 不喜欢超过 340 位小数

Lesson 05:this关键字类变量类方法;JAVA的特征

如何在 Java/Kotlin 中获取 NumberFormat 的语言环境?

Java SE基础部分——常用类库之NumberFormat

使用 java.text.NumberFormat 解析日本货币字符串