(1) проверить, что порт используется или нет, убить этот процесс
$ lsof -i: [port]
(2) другой причиной является использование порта ipv6, решение:
изменить /etc/sysctl.conf
добавить это в файл
net.ipv6.conf.all.disable_ipv6 = 1
затем сделайте эффект
$ sudo sysctl -p /etc/sysctl.conf
или просто перезагрузите
Ну, Math.Round
хочет double
, а не float
, поэтому
Math.Round(ff, 1, MidpointRounding.AwayFromZero);
равняется
Math.Round((double)ff, 1, MidpointRounding.AwayFromZero);
и если мы проверяем (double)ff
значение
Console.Write(((double)ff).ToString("R"));
мы увидим ошибки округления в действии
31.149999618530273
Наконец, Math.Round(31.149999618530273, 1, MidpointRounding.AwayFromZero) == 31.1
как и ожидалось
В плавающей запятой все числа представляются внутренне в виде дробей, где знаменатель является степенью 2.
(Это аналогично тому, как десятичные дроби на самом деле являются дробями со знаменателями степени 10. 31.15
это просто способ записи дроби 3115/100
)
В плавающей запятой, 31.15
должен быть представлен внутри как двоичное число. Ближайшая двоичная дробь: 1111.1001001100110011001100110011001100110011001100110011001100...repeating
1100
повторяется (повторяется вечно), поэтому число будет усечено в зависимости от того, хранится ли оно в двойном или числовом выражении. В формате с плавающей точкой оно усекается до 24 цифр, а в двойном - до 53.
Exact: 1111.100100110011001100110011001100110011001100110011001100110011001100...forever
Float: 1111.10010011001100110011
Double: 1111.1001001100110011001100110011001100110011001100110
Следовательно, вы можете видеть, что двойное число, в которое преобразуется это число, на самом деле немного больше, чем число, в которое оно преобразуется. Таким образом, ясно, что оно не обязательно округляется до одного и того же числа, так как это не одно и то же число с самого начала.