我最近已从Java 8升级到Java10。我在使用Java 10时遇到了失败的测试,我不确定该如何处理。我们有一些代码使用String
将双值的java.text.NumberFormat.getInstance()
表示解析为双值。如果以指数形式写入值,则使用Java 10时解析的值不正确。
这是我的JUnit测试:
@Test
public void testMe() throws ParseException {
String input = "2.0E-4";
double output = NumberFormat.getInstance().parse(input).doubleValue();
System.out.println(output);
}
使用Java 8时,将double变量正确设置为0.0002:
使用Java 10时,双精度值错误地设置为2.0:
有人知道这是否是Java方面的故意更改?
不过,看来Double.valueOf()
可以正确解析它。
答案 0 :(得分:1)
从JDK 9开始,默认语言环境数据使用从Unicode联盟的公共语言环境数据存储库(CLDR)派生的数据。因此,在Java 9和更高版本中,某些语言环境有所变化。请参阅Java 9和相应的JEP 252的发行说明。
请参阅CLDR数字符号表上的exponential symbol,对于en_AU
,指数符号是e
(小写)而不是E
(大写)。因此,输出的差异。
String input = "2.0e-4";
double output = NumberFormat.getInstance().parse(input).doubleValue();
System.out.println(output);
将给出预期的输出:
java version "10.0.1" 2018-04-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode)
2.0E-4