Как мне сделать сумму чисел равной 1 - PullRequest
3 голосов
/ 11 ноября 2011

Я работаю с вероятностями, и мне нужно проверить, что сумма значений равна 1. Я писал юнит-тесты, и один из тестов не удался. Вот почему это не удалось:

double[] probabilities = new[] { 0.4, 0.3, 0.2, 0.1 };
double sum = probabilities.Sum();
//On my PC gives sum of 0.99999999999999989

if (sum != 1)
{
    throw new ArgumentException(
        "Sum of the probabilities does not equal to 1. " +
        "Computed value was: " + sum);
}

Что я могу изменить, чтобы это стало правдой: 0.4 + 0.3 + 0.2 + 0.1 = 1?

Ответы [ 3 ]

6 голосов
/ 11 ноября 2011

double не даст вам точности, которая вам нужна для такого рода математики.

Переключитесь на decimal и все будет хорошо.

1 голос
/ 11 ноября 2011

почти во всех системах модульных тестов есть утверждение, которое проверяет двойники на "близость", что два значения находятся в пределах некоторого указанного допуска.Например, NUnit Assert.AreEqual имеет перегрузку, которая принимает три двойных значения: фактическое значение, ожидаемое значение и значение дельты, то есть максимальную величину, на которую могут отличаться первые два значения для прохождения Assert ...

1 голос
/ 11 ноября 2011

decimal имеет точность, которую вы хотите. Если вам нужна точность 10 базы, придерживайтесь decimal.

Вот более старая, но соответствующая статья на эту тему: Что должен знать каждый компьютерщик об арифметике с плавающей точкой

...