我正在测试我的一个方法double getSqrt(double s)
,并拥有以下JUnit测试代码:
@Test
public void testGetSqrt() {
System.out.println("getSqrt");
double s = 16.0;
Calculator instance = new Calculator();
double expResult = 4.0;
double result = 4.000000000052429; // was "instance.getSqrt(s);" here
// now hardcode for test purpose
System.out.println(System.getProperty("java.class.path"));
assertEquals(expResult, result, 0.0);
}
每次都失败,无论我如何改变容差" 0.0"," 0.1"," 0.00"," 0.01 "," 0.001" ....报告如下:
AssertionFailedError:expected:< 4.0&gt ;;但是:< 4.000000000052429>
我使用的是JUnit 4.12和Hamcrest 1.3。
我的进口商品:
import org.junit.Test;
import static org.junit.Assert.*;
我是否使用了容差错误?
控制台上的输出:
compile-test-single:
Testsuite: descriptivestatisticsapplication.processing.CalculatorTest
getSqrt
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.079 sec
------------- Standard Output ---------------
getSqrt
C:\Java\jdk1.8.0_111\jre\lib\javaws.jar;C:\Java\jdk1.8.0_111\jre\lib\deploy.jar;C:\Java\jdk1.8.0_111\jre\lib\plugin.jar;C:\Users\Z\Documents\NetBeansProjects\DescriptiveStatisticsApplication\build\classes;C:\Program Files\NetBeans 8.2\platform\modules\ext\junit-4.12.jar;C:\Program Files\NetBeans 8.2\platform\modules\ext\hamcrest-core-1.3.jar;C:\Users\Z\Documents\NetBeansProjects\DescriptiveStatisticsApplication\build\test\classes;C:\Program Files\NetBeans 8.2\extide\ant\lib\ant-launcher.jar;C:\Program Files\NetBeans 8.2\extide\ant\lib\ant.jar;C:\Program Files\NetBeans 8.2\extide\ant\lib\ant-junit.jar;C:\Program Files\NetBeans 8.2\extide\ant\lib\ant-junit4.jar
------------- ---------------- ---------------
5月27日更新:
根据评论中的建议进行一些测试后,此单元测试现在可以成功通过。我认为这个问题可以结束。
我担心的是,我没有找到任何失败原因以及为什么现在成功!相同的代码,相同的逻辑!我唯一做的就是注释掉一些非重要的行然后再添加它们,更改一些声明语句序列然后再更改它们。相同的代码有不同的行为。我没有改变建筑物和运行env和libs的任何东西。这没有任何意义。一段代码的结果应该是可重现的。
答案 0 :(得分:-1)
Java中的浮点数并不准确,因为您已经看到了结果< 4.000000000052429> 换句话说,在java中将浮点数设置为4,实际上不是4。 您可以使用long甚至BigInteger来解决此问题。