C ++ Округление значения с плавающей точкой до числа дробных цифр - PullRequest
0 голосов
/ 25 февраля 2020

Я пробовал std :: round, но он не дает мне результата, который я хочу точно Поэтому мой вопрос: у меня есть программа на C#, и я конвертирую в C ++, и я столкнулся с этой проблемой. C# Math.round и C ++ round различны. Так что это вызывает неправильные расчеты. C# код:

Console.WriteLine(Math.Round(0.850, 1));

Выход:

0,8

C ++ код:

 std::cout << roundf(0.850f) << std::endl;

Выход:

1

Так как Вы видите, что они разные. Как я могу решить это?

1 Ответ

2 голосов
/ 25 февраля 2020

Версия C# округляет double до одного десятичного знака, версия C ++ округляет float до ближайшего целого числа.

Округление двоичной плавающей запятой до фиксированного числа десятичных разрядов места на самом деле не имеют особого смысла, так как округленное число, скорее всего, будет приблизительным. Например, 0.8 нельзя представить точно в двоичной форме с плавающей запятой.

Функция округления в C ++ округляет только до ближайшего целочисленного значения, что, учитывая вышеизложенное, является разумным выбором.

You можно восстановить поведение C# (округление до 1 десятичного знака) с помощью std::round(0.850 * 10) / 10.

Обратите внимание, что я опустил суффикс f, чтобы соответствовать типу C# double.

...