Деление с использованием суммы не работает

В моей программе я создал список пользовательского класса. Этот класс содержит целочисленное свойство. Я хочу разделить другое заданное целое число на сумму этих свойств в моем списке, но Sum() не работает должным образом в делениях.

Я создал для вас короткую демонстрацию, это простое консольное приложение:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sum
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Class> list = new List<Class>() {
                new Class() { Property = 1},
                new Class() { Property = 1},
                new Class() { Property = 1},
                new Class() { Property = 1},
                new Class() { Property = 1},
                new Class() { Property = 1}
            };

            Console.WriteLine("Sum: " + list.Sum(x => x.Property));
            Console.WriteLine("Division: " + (2 / list.Sum(x => x.Property)));
            Console.ReadLine();
        }
    }

    public class Class
    {
        public int Property { get; set; }
    }
}

Я знаю, что могу сохранить сумму свойств в новой переменной и использовать ее впоследствии для своего деления. Но разве Sum не должно сработать в этой ситуации?


person Christopher    schedule 25.03.2013    source источник
comment
Вы используете целочисленное деление, а не деление с плавающей запятой.   -  person Christian Ivicevic    schedule 25.03.2013
comment
Целочисленное деление   -  person Corak    schedule 25.03.2013


Ответы (5)


Это потому, что вы используете целочисленное деление, а не деление с плавающей запятой. Попробуйте вместо этого использовать 2f для константы float:

Console.WriteLine("Division: " + (2f / list.Sum(x => x.Property)));

Или 2d вместо константы double:

Console.WriteLine("Division: " + (2d / list.Sum(x => x.Property)));

Или 2m вместо константы decimal:

Console.WriteLine("Division: " + (2m / list.Sum(x => x.Property)));

Любой из них даст вам результат, который вы ищете (только с некоторой разницей в точности)

person p.s.w.g    schedule 25.03.2013

Проблема здесь в том, что вы используете целочисленное деление, которое поддерживает только целые числа. Вместо этого вы хотите выполнить деление с плавающей запятой, которое поддерживает десятичные дроби.

Console.WriteLine("Division: " + ((double)2 / list.Sum(x => x.Property)));
person JaredPar    schedule 25.03.2013

Я предполагаю, что вы ожидаете, что результат будет 2 / 6 = 0,33, но целочисленное деление всегда приводит к целому числу (в С#). Таким образом, по крайней мере одно число должно быть типом с плавающей запятой, например double.

Console.WriteLine("Division: " + (2d / list.Sum(x => x.Property)));

Деление округляет результат до нуля, а абсолютное значение результата — это максимально возможное целое число, которое меньше абсолютного значения частного двух операндов. Результат равен нулю или положителен, если два операнда имеют одинаковый знак, и равен нулю или отрицателен, если два операнда имеют противоположные знаки.

http://msdn.microsoft.com/en-us/library/aa691373(v=vs.71).aspx

person Tim Schmelter    schedule 25.03.2013

Sum на самом деле работает, но результат 0, потому что вы используете целочисленное деление: int делит int => результат будет int, вы должны изменить:

(2.0 / list.Sum(x => x.Property))

Это будет работать

person cuongle    schedule 25.03.2013

Думаю, на выходе будет 0 из-за целочисленного деления.

person gkovacs90    schedule 25.03.2013