Java 比较从文本文件读取的双精度
我将文本文件中的一个double与硬编码的double进行比较,从文本文件中读取的值在Java中使用double.parseDouble()放入一个double变量。然后,我用下面的一行来声明它们的相等性。这个断言是否可能失败?这取决于价值吗Java 比较从文本文件读取的双精度,java,unit-testing,assert,Java,Unit Testing,Assert,我将文本文件中的一个double与硬编码的double进行比较,从文本文件中读取的值在Java中使用double.parseDouble()放入一个double变量。然后,我用下面的一行来声明它们的相等性。这个断言是否可能失败?这取决于价值吗 assertEquals(17353820.450663020000, Double.parseDouble(input.next()), 0.0); 请注意,0.0是用于比较双精度的ε值 文本文件内容: 17353820.450663020000 任
assertEquals(17353820.450663020000, Double.parseDouble(input.next()), 0.0);
请注意,0.0是用于比较双精度的ε值
文本文件内容:
17353820.450663020000
任何语言中的浮点和双精度都有精度限制,因此可以近似于字符串格式。有关详细信息,请参阅。这就是epsilon参数的作用,它表示当测试值不能精确匹配时,测试值必须被认为是“正确”的 这个断言是否可能失败 没有 这取决于价值吗
assertEquals(17353820.450663020000, Double.parseDouble(input.next()), 0.0);
没有
Javadoc说: 返回一个新的
double
初始化为指定的字符串,表示的值,该值由类double
的valueOf
方法执行
Java语言规范第节说:
有关从浮点数的Unicode字符串表示法到内部IEEE 754二进制浮点数表示法的正确输入转换的详细信息,请参见软件包的valueOf
方法valueOf
和classDouble
java.lang
正如您所看到的,编译器使用与方法相同的逻辑来解析double,因此结果总是相同的。可能的重复是询问编译器的字符串到double转换是否产生与运行时系统的字符串到double转换相同的结果。我猜是“也许”。但是为什么代码的成功运行需要它呢?测试应该测试重要的东西,而不是今天碰巧发生的事情。@另一个dave不需要猜测,它被指定为完全相同。“看!”安德烈亚斯——谢谢!这根本不是问题的答案。所以,不可能在特殊变量上存在舍入问题?例如,3.999999999999(有足够多的9)是否可能变为4?@A.Mashreghi如果它变为4,则编译器和parseDouble
都会导致该结果,因此结果仍然是double
值相等。如果Java源代码中数字文本的字符与给定给parseDouble
的字符串相同,那么double
值将是相同的,因为Java语言规范规定必须如此。