(Я понимаю, что это старый вопрос, но я отвечаю на него, поскольку сам понимаю некоторые вещи...)
Мое предположение состоит в том, что «printf» преобразует число с плавающей запятой в двойное перед применением форматирования. Я попытался преобразовать число с плавающей запятой в двойное, а затем посмотрел на результат ToString («f2») двойного значения, который он округлил в противоположном направлении, поскольку значение числа с плавающей запятой было округлено.
Другие поддерживают эту идею о printf:
C автоматически преобразует значения с плавающей запятой в двойные (это стандартное преобразование, выполняемое при вызове функции, которая принимает переменные аргументы, например, int printf...
https://stackoverflow.com/a/7480244/119418
https://stackoverflow.com/a/6395747/119418
Я считаю, что число с плавающей запятой округляется в большую сторону потому, что 2,995F не полностью преобразуется в двоичное число и равно 2,99499989F, а мы ожидаем, что 2,995 будет округлено в большую сторону.
Я считаю, что причина, по которой число с плавающей запятой, скопированное в двойное округление, заключается в том, что 2,995 как двойное ‹> 2,99499989 как двойное, а фактическое двойное значение 2,995 больше, чем это значение (более точное значение ближе к его истинному десятичному значению), и поэтому это значение мы ожидаем округлить вниз.
Может показаться неправильным, что 2,99499989F округляется до 3,00, хотя на первый взгляд оно меньше 2,995, но имейте в виду, что 2,99499989 — это десятичное число, а не число с плавающей запятой, и вы «конвертируете» его в число с плавающей запятой, фактически преобразуя основание- 10 по основанию 2, и на самом деле это 1 и 0, а затем запрашивается округление до числа с основанием 10, что означает, что должно произойти преобразование. Что ж, есть по крайней мере 2 значения с основанием 10, которые я упомянул, которые могут быть преобразованы в это число как число с плавающей запятой, и самое простое из них — 2,995.
person
Mafu Josh
schedule
25.10.2013