Округление числа с плавающей точкой с определенной точностью - PullRequest
0 голосов
/ 08 марта 2019

Я хочу округлить число до 4 знаков после запятой.Это означает, что 0,333333333 будет 0,3333, но 0,33 все еще 0,33

Ответы [ 4 ]

2 голосов
/ 08 марта 2019

Используйте функцию std::round()

Стандартная библиотека C ++ предлагает функции для выполнения округления.Для float s это:

float round ( float arg );

, округляет arg до ближайшего целого значения.Теперь вы хотите другое десятичное разрешение.Так что не округляйте ваше значение, округляйте ваше значение до 10000, так что ваша одиночная цифра теперь является прежней 0,0001.Или, в более общем смысле:

float my_round(
    float x,
    int num_decimal_precision_digits)  
{
    float power_of_10 = std::pow(10, num_decimal_precision_digits);
    return std::round(x * power_of_10)  / power_of_10;
}

Обратите внимание, что могут быть проблемы с точностью, поскольку вычисления и представления с плавающей запятой точны только с точностью до определенного числа цифр, а в my_round у нас есть по крайней мере четыре источникатакой неточности: вычисление степени 10, умножение, деление и фактическое округление.

0 голосов
/ 08 марта 2019

Приведите его к типу с фиксированной точкой

Если вы хотите, чтобы ваши результаты были округлены с фиксированным числом десятичных цифр, вы намекаете, что вам на самом деле не нужен «плавающий» аспект чисел с плавающей запятой. Ну, в этом случае приведите ваше значение к типу, который представляет такие числа. По сути, это будет целочисленный числовой индекс (переменная времени выполнения) и знаменатель с фиксированной продолжительностью компиляции (который в вашем случае будет 10 000).

На сайте есть старый вопрос о математике с фиксированной запятой:

Как лучше всего выполнять математику с фиксированной запятой?

но я бы посоветовал вам рассмотреть библиотеку CNL как нечто недавнее / популярное. Также было сделано несколько предложений по добавлению типов с фиксированной запятой в стандартную библиотеку. Я не знаю, какой из них самый дальний, но взгляните на это: Реальные числа с фиксированной точкой Джона Макфарлейна.

Вернемся к вашему конкретному случаю. Типы с фиксированной запятой обычно могут быть построены из типов с плавающей запятой. Просто сделай это.

0 голосов
/ 08 марта 2019

Если вам нужно напечатать округленное число, это одно из правильных решений:

cout << setprecision(4) << x << '\n';

std :: setprecision документация .

Демонстрация в реальном времени

До тех пор, пока не будет предоставлено больше подробностей, невозможно дать лучший ответ.

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

0 голосов
/ 08 марта 2019

Вот решение, например:

float ret = float(round(0.333333333 * 10000)) / 10000)

Вы можете написать его как функцию.Может быть, был бы лучший способ?

...