Значение с плавающей запятой в сравнении таблицы запросов SLIM

Я новичок в Фитнесе. Я использую таблицу запросов подмножества. Он отлично работает, за исключением случаев, когда мне нужно сравнивать значение с плавающей запятой. Есть ли способ сравнить значения с определенным уровнем точности?

Например, тест должен пройти, когда я сравниваю 4.12 с 4.1234. Но сейчас похоже, что сравнение строк не удается. Есть ли способ отменить часть проверки?


person Ramp    schedule 27.05.2012    source источник


Ответы (2)


Вы можете использовать символ тильды для обозначения «приблизительно равно», например ~ = 4,12

Подробнее см. http://fitnesse.org/FitNesse.UserGuide.SliM.ValueComparisons. .

person Andy    schedule 28.05.2012
comment
Ах хорошо, это позор. Все, что я могу предложить, это сделать собственное округление в коде фикстуры. - person Andy; 29.05.2012

Чтобы добиться приблизительного сравнения значений Double и Float, я переопределил класс фикстуры следующим образом:

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 используют для сравнения как относительное значение epsilon, так и абсолютное значение precision. Точность определяется из ожидаемых входных данных, так что 23,099 имеет точность 0,001. Они также ожидают специальных значений, таких как nan для NaN и inf для +/- Infinitive. Вот один пример:

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;
        }
    }
}
person CPW    schedule 21.12.2017