威尔逊得分为C#的1-5星评级

时间:2016-05-14 01:40:12

标签: c# mysql

我发现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版本实际上是正确的,有人可以帮助我。

1 个答案:

答案 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);