我发现this非常好地解释了计算,但我真的不知道它是否正确。我已经看过很多关于这个主题的帖子,我还没有看到一个计算为5
最重要的部分是:
window
我将其转换为C#,如下所示
Stars Negative Positive Total
0 0 0 0
1 1 0 1
2 0.75 0.25 1
3 0.5 0.5 1
4 0.25 0.75 1
5 0 1 1
SET new.total = new.positive + new.negative,
new.stars = ROUND( (((new.positive / new.total) * 4) + 1) * 2, 0) / 2,
new.lower_bound = ((new.positive + 1.9208) / (new.positive + new.negative) - 1.96 * SQRT((new.positive * new.negative) / (new.positive + new.negative) + 0.9604) / (new.positive + new.negative)) / (1 + 3.8416 / (new.positive + new.negative))
如果此编码转换正确且sql版本实际上是正确的,有人可以帮助我。
答案 0 :(得分:1)
您可以将下限值存储为double,不需要对其进行舍入。 C#函数可以变成这样的东西:
private static double WilsonAlgorithm(double positive, double negative)
{
return ((positive + 1.9208) / (positive + negative) -
1.96 * Math.Sqrt((positive * negative) / (positive + negative) + 0.9604) /
(positive + negative)) / (1 + 3.8416 / (positive + negative));
}
(信用:http://www.evanmiller.org/how-not-to-sort-by-average-rating.html,其中大部分来自他页面上的sql代码)
转换为星星 - >正/负,您可以计算它们而不会过度使用三元运算符以提高可读性。
// constants
const int maxRating = 5;
const int minRating = 1;
const double shareRating = 0.25;
// conversions
var stars = 5;
var positive = (stars - minRating) * shareRating;
var negative = (maxRating - stars) * shareRating;
// ..
// usage?
var lowerBoundRating = WilsonAlgorithm(totalPositive, totalNegative);