作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我举一个我实际情况的简化例子:
假设我必须用 Java 实现一些代码来计算 Weighted arithmetic mean .我得到了两个浮点值数组(表示为 double 值),每个数组的长度都相同,第一个包含值,第二个包含它们各自的权重。
假设我做了一些实现,它返回一个浮点值(也是一个 double 值),表示输入值的加权算术平均值:
public static double calculateWeightedArithmeticMean(double[] values,
double[] weights) {
if(values.length != weights.length) {
throw new IllegalArgumentException();
}
if(values.length == 0) {
return 0;
}
if(values.length == 1) {
return new BigDecimal(values[0]).setScale(1, RoundingMode.HALF_UP).
doubleValue();
}
BigDecimal dividend = BigDecimal.ZERO;
BigDecimal divisor = BigDecimal.ZERO;
for(int i = 0; i < values.length; i++) {
dividend = dividend.add(new BigDecimal(values[i]).
multiply(new BigDecimal(weights[i])));
divisor = divisor.add(new BigDecimal(weights[i]));
}
if(dividend.compareTo(BigDecimal.ZERO) == 0) {
return 0d;
}
return dividend.divide(divisor, 1, RoundingMode.HALF_UP).doubleValue();
}
我编写了一个传递一些值(例如 3 个值 + 3 个权重)的单元测试。我首先手动计算他们的加权算术平均值(使用计算器),然后编写一个单元测试来检查我的代码是否返回该值。
我认为,由于舍入误差,这种测试不适用于使用的值数量大得多的情况。也许我实现的代码适用于 3 个值 + 3 个权重(对于给定的精度),因为在这种情况下舍入误差小于精度,但舍入误差很可能大于 1000 的所需精度值 + 1000 个权重。
我的问题是:
最佳答案
在编写单元测试时,你总是要在某个地方放弃。诀窍是当您确信自己知道的足够多时就放弃 :-)
在您的案例中,一些简单的测试用例是:
BigDecimal
输入数组)来计算所选输入的误差范围比较结果时,使用 assertEquals(double, double, double)
其中前两个是要比较的值,最后一个是精度 (1e-3
逗号后的 3 位数字)。
最后,您需要使用该算法并查看其行为方式。当您发现问题时,然后为这个特定案例添加一个测试用例。
关于Java,BigDecimal : How do I unit-test for rounding errors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26138548/
我是一名优秀的程序员,十分优秀!