我正在为产品编写一个小型投票,每个用户可以对其每个属性(例如:清洁度和整洁度,服务,位置,员工)进行5个分数(可以稍后增加)进行轮询。每个分数都有一个形容词(1:最差,2:差,3:好,4:非常好,5:非凡)。
例如,用户可以轮询到以下产品之一: CleanLiness and Neatness:4(非常好) 服务:3(好) 位置:1(最差) 员工:5人(特别)
这个分数的平均值是产品的分数,它将是十进制的,对于这个例子,它是3.25。
现在我想通过这个结果给出产品的形容词(3.25),如果它的点低于一半像3.25那么,它向下舍入到(对于这个3)并且如果它的点是相等的并且高于一半像3.7一样,它向上(4)
我很想知道最好的算法是什么?
我班级的设计如下:
public class Product
{}
public Class Poll
{
public int Id {get; set;}
public int ProductId {get; set;}
public Product Product {get; set;}
public decimal Score {get; set}
public string Adjective {get; set;}
public ICollection<PollAttributes> Attributes {get; set;}
}
public class Attribute // for the attribute like Services
{
public int Id {get; set;}
public string Title {get; set;}
public ICollection<PollAttributes> Attributes {get; set;}
}
public Class PollAttributes
{
public decimal score {get; set;}
public int AttributeId {get; set;}
public Attribute{get; set;}
public int PollId {get; set;}
public Poll Poll {get; set;}
}
答案 0 :(得分:1)
您可以使用Convert.ToInt32(Math.Round(score))将值四舍五入为整数值,并使用包含属性值的Dictionary(),这样您就可以执行以下操作:
poll.attribute = lookup[Convert.toInt32(Math.Round(score))];
答案 1 :(得分:0)
平均很容易:您只需保留已投票的人数,以及每个参数的分数总和(清洁度,服务等)。 投票完成后,您可以通过将该参数的总和除以计数来获得每个参数的平均值。然后,将5个平均分数相加,并将总和除以5,得到产品的总体平均值。
现在,你创建一个像这样的字符串数组:
String[] adj = {"Worst", "Acceptable", "Good", "Very Good", "Excellent"};
//let "score" be the product average score
double epsilon = 1e-8;
double score = 3.51;
int adj_index = (int)(score + epsilon);
if(score - adj_index >= 0.5){//the floating part was bigger than half
adj_index++;
}
printf("Product is %s", adj[adj_index]);
请注意,epsilon的存在是非常必要的,因为3.99999999999999999和4.0被认为是相同的,所以我们需要一个精度参数。实际上,double 4.0不能一直表示为4。