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` 假定数字类型不正确的主要内容,如果未能解决你的问题,请参考以下文章
Lesson 05:this关键字类变量类方法;JAVA的特征
如何在 Java/Kotlin 中获取 NumberFormat 的语言环境?