C # .Net двойной выпуск ... 6,8! = 6,8? - PullRequest
2 голосов
/ 16 августа 2010

Я проводил какое-то модульное тестирование на работе, и для одного из утверждений выявилась странная ошибка. Обратите внимание, что Ожидаемые значения и фактические значения являются значениями типа double.

Assert.AreEqual(expectedValue, actualValue);

В исключении указано, что они не равны, уточнив, что "ожидаемое значение: <6,8> фактическое значение: <6,8>."

Ожидаемое значение является жестко закодированным 6,8, а фактическое значение формулируется с использованием значений базы данных, проходящих через наши методы классификации (такие как Equal Records или Jenks Natural Breaks).

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

Ответы [ 3 ]

3 голосов
/ 16 августа 2010

Я не совсем уверен, что вы имеете в виду, заставляя мантиссу соответствовать отображаемому значению ... там нет нет двойных значений, которые точно равны 0,1, например.

ЕслиВы хотите, чтобы какой-то код отображал значение точного двойного числа, однако у меня есть файл DoubleConverter.cs , который упрощает:

 double d = 0.1;
 string x = DoubleConverter.ToExactString(d);

Другая альтернативадолжен использовать спецификатор формата туда и обратно ("r") при преобразовании двойного числа в строку - это гарантирует, что у результата будет достаточно информации для воспроизведения того же точного значения позже.Другими словами, если x != y, то x.ToString("r") != y.ToString("r").

1 голос
/ 16 августа 2010

Вы можете преобразовать оба в строку: actualValue.ToString("0.000") и сравнить эти строки.

Это может быть сделано в соответствии с вашими требованиями.

0 голосов
/ 16 августа 2010

Если вы хотите проверить, соответствуют ли значения дисплея по умолчанию, просто сравните значения дисплея по умолчанию:

Assert.AreEqual(expectedValue.ToString(), actualValue.ToString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...