Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较从文本文件读取的双精度_Java_Unit Testing_Assert - Fatal编程技术网

Java 比较从文本文件读取的双精度

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 任

我将文本文件中的一个double与硬编码的double进行比较,从文本文件中读取的值在Java中使用double.parseDouble()放入一个double变量。然后,我用下面的一行来声明它们的相等性。这个断言是否可能失败?这取决于价值吗

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
class
Double
java.lang


正如您所看到的,编译器使用与方法相同的逻辑来解析double,因此结果总是相同的。

可能的重复是询问编译器的字符串到double转换是否产生与运行时系统的字符串到double转换相同的结果。我猜是“也许”。但是为什么代码的成功运行需要它呢?测试应该测试重要的东西,而不是今天碰巧发生的事情。@另一个dave不需要猜测,它被指定为完全相同。“看!”安德烈亚斯——谢谢!这根本不是问题的答案。所以,不可能在特殊变量上存在舍入问题?例如,3.999999999999(有足够多的9)是否可能变为4?@A.Mashreghi如果它变为4,则编译器和
parseDouble
都会导致该结果,因此结果仍然是
double
值相等。如果Java源代码中数字文本的字符与给定给
parseDouble
的字符串相同,那么
double
值将是相同的,因为Java语言规范规定必须如此。