float / double Math.Round в C # [дубликат]

(1) проверить, что порт используется или нет, убить этот процесс

$ lsof -i: [port]

(2) другой причиной является использование порта ipv6, решение:

изменить /etc/sysctl.conf

добавить это в файл

net.ipv6.conf.all.disable_ipv6 = 1

затем сделайте эффект

$ sudo sysctl -p /etc/sysctl.conf

или просто перезагрузите

18
задан Dmitry Bychenko 17 January 2019 в 12:50
поделиться

2 ответа

Ну, 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 как и ожидалось

0
ответ дан Dmitry Bychenko 17 January 2019 в 12:50
поделиться

В плавающей запятой все числа представляются внутренне в виде дробей, где знаменатель является степенью 2.

(Это аналогично тому, как десятичные дроби на самом деле являются дробями со знаменателями степени 10. 31.15 это просто способ записи дроби 3115/100)

В плавающей запятой, 31.15 должен быть представлен внутри как двоичное число. Ближайшая двоичная дробь: 1111.1001001100110011001100110011001100110011001100110011001100...repeating

1100 повторяется (повторяется вечно), поэтому число будет усечено в зависимости от того, хранится ли оно в двойном или числовом выражении. В формате с плавающей точкой оно усекается до 24 цифр, а в двойном - до 53.

Exact:  1111.100100110011001100110011001100110011001100110011001100110011001100...forever
Float:  1111.10010011001100110011
Double: 1111.1001001100110011001100110011001100110011001100110

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

0
ответ дан Ben 17 January 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: