我是相当新的FitNesse的。 我现在用的子集查询表。 它的工作原理除非我有比较浮点值的罚款。 有没有什么办法可以比较值,以准确的一定的水平?
例如,当我比较4.12至4.1234的测试应该通过。 但现在,它看起来像它正在一个字符串比较和失败。 反正我有可以覆盖验证的一部分?
我是相当新的FitNesse的。 我现在用的子集查询表。 它的工作原理除非我有比较浮点值的罚款。 有没有什么办法可以比较值,以准确的一定的水平?
例如,当我比较4.12至4.1234的测试应该通过。 但现在,它看起来像它正在一个字符串比较和失败。 反正我有可以覆盖验证的一部分?
您可以使用波浪号字符意味着“约等于”,如〜= 4.12
见http://fitnesse.org/FitNesse.UserGuide.SliM.ValueComparisons了解更多详情。
实现双大约比较浮点值,我重写夹具类,如下:
public class ApproxColumnFixture extends ColumnFixture {
@Override
public void check(Parse cell, TypeAdapter a) {
if (a.type == Double.class) {
super.check(cell, new ApproxDoubleAdapter(a));
} else if (a.type == Float.class) {
super.check(cell, new ApproxFloatAdapter(a));
} else {
super.check(cell, a);
}
}
}
这两个TypeAdapter类同时使用相对值ε和比较绝对值精度 。 精度从预期的输入检测到的,以便23.099具有精度0.001。 他们还期望特殊值,如“南”为NaN,并且“INF”为+/-不定式。 下面是一个例子:
public class ApproxDoubleAdapter extends TypeAdapter {
public final Double ZERO = new Double(0.0);
private final double epsilon;
private int precisions = -1;
public ApproxDoubleAdapter(final TypeAdapter classDoubleAdapter, double epsilon) {
this.target = classDoubleAdapter.target;
this.fixture = classDoubleAdapter.fixture;
this.field = classDoubleAdapter.field;
this.method = classDoubleAdapter.method;
this.type = classDoubleAdapter.type;
this.isRegex = classDoubleAdapter.isRegex;
this.epsilon = epsilon;
}
public ApproxDoubleAdapter(final TypeAdapter adapt) {
this(adapt, 0.0001);
}
public Object parse(String s) throws Exception {
if ((s == null) || s.equals("null")) {
return null;
}
if (s.equals("0")) {
return ZERO;
}
if (s.equals("nan")) {
return Double.NaN;
}
if (s.equals("inf")) {
return Double.POSITIVE_INFINITY;
}
precisions = s.indexOf(".");
if (precisions >= 0) {
precisions = s.length() - 1 - precisions;
}
return new Double( Double.parseDouble(s) );
}
public boolean equals(Object a, Object b) {
if (a == null) {
return (b == null);
}
if (b == null) {
return (a == null);
}
if ((a.getClass() != Double.class) || (b.getClass() != Double.class)) {
return false;
}
double aV = (Double) a;
double bV = (Double) b;
if (Double.isNaN(aV)) {
return Double.isNaN(bV);
}
if (Double.isNaN(bV)) {
return Double.isNaN(aV);
}
if (Double.isNaN(aV)) {
return Double.isNaN(bV);
}
if (Double.isInfinite(aV)) {
return Double.isInfinite(bV);
}
if (Double.isInfinite(bV)) {
return Double.isInfinite(aV);
}
final double diff = Math.abs(aV - bV);
if (diff <= Math.abs(aV + bV) * epsilon) {
return true;
}
if (precisions > 0) {
return diff <= Math.pow(10, precisions);
} else if (aV == 0.0) {
return diff < epsilon;
} else {
return false;
}
}
}