2016-07-02 3 views
1

Я пишу небольшой опрос на продукцию, продукт которого может быть опрошен каждым пользователем в 5 баллов (что может увеличиться позже) для каждого из его свойств (например: Чистота и аккуратность, Услуги, местоположение, Персонал). у каждого балла есть прилагательное (1: худшее, 2: плохое, 3: хорошее, 4: очень хорошее, 5: необычное).Каков наилучший алгоритм для небольшого механизма опроса?

, например, пользователь может опрашивать к одному из продукта, как это: чистота и опрятность: 4 (очень хорошо) Услуги: 3 (хорошо) место: 1 (худший) Персонал: 5 (внеочередная)

Среднее значение этого показателя будет оценкой продукта, и оно будет десятичным, для этого примера это 3,25.

Теперь я хочу приложить к прилагательному произведение к этому результату (3.25), если оно находится под половиной наподобие 3.25, оно округляется до нуля (для этого 3), и если это точка равна и выше наполовину, как 3.7, он округляется до 4 (4)

Мне интересно, какой из лучших алгоритмов для этого?

мой classs' дизайн, как показано ниже:

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;} 
} 

ответ

1

Вы могли бы использовать Convert.ToInt32 (Math.Round (счет)), чтобы получить значение округляется до целого значения и имеют Dictionary() удерживая значения атрибутов, например, что вы могли бы сделать что-то вроде:

poll.attribute = lookup[Convert.toInt32(Math.Round(score))];

+1

Просто также учитывайте «нечетное» поведение округления по умолчанию .NET: округление банкира. Это может не всегда дать вам ответ, который вы ожидаете. Поэтому я настоятельно рекомендую использовать: 'Math.round (оценка, MidpointRounding.AwayFromZero)' , так как это даст вам округление, которое вы ожидаете. – daf

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]); 

Заметим, что существование эпсилон очень необходимо, потому что +3,99999999999999999 и 4,0 считаются одинаковыми, так нам нужен параметр точности. Фактически, double 4.0 не может быть представлен точно как 4 все время.

Смежные вопросы