Как можно ограничить количество символов после десятичной точки при вводе данных в языке программирования C++?

Как правильно использовать std::fixed и std::setprecision(x) при выводе чисел в С++?
  • 25 января 2024 г. 14:49
Ответы на вопрос 3
Для того чтобы ограничить количество символов после десятичной точки при вводе данных в C++, нужно использовать механизм форматирования ввода с помощью библиотечных функций и операторов. Однако, хочу отметить, что при вводе данных это сделать немного сложнее, так как поток ввода std::cin предназначен для простого считывания данных без их форматирования. Ограничение количества символов чаще применяется в момент вывода значений.

При выводе данных, чтобы указать, какое количество цифр нужно выводить после десятичной точки для чисел с плавающей точкой в стандартный поток вывода (или в любой другой поток), используются манипуляторы `std::fixed` и `std::setprecision` из библиотеки `<iomanip>`:

```cpp
#include <iostream>
#include <iomanip>

int main() {
    double num = 3.141592653589793;
    std::cout << std::fixed << std::setprecision(2) << num << std::endl; // Вывод: 3.14
    return 0;
}
```

В приведенном выше коде:

- `std::fixed` задает фиксированную точность для вывода чисел с плавающей точкой, что означает, что число будет отображаться в десятичном представлении.
- `std::setprecision(x)` устанавливает точность вывода до `x` знаков после десятичной точки при использовании с `std::fixed`.

Чтобы код сработал должным образом, не забудьте добавить `#include <iomanip>`, так как `std::setprecision` определена в этом заголовочном файле.

Если вам необходимо работать с вводом данных и ограничить количество символов после десятичной точки, вы можете считать число в виде строки, а затем обработать строку в соответствии с вашими требованиями или использовать более низкоуровневые функции для чтения и обработки ввода символ за символом, однако это будет более сложное решение.
Никто ничего не дописывает. Дело в специфике хранения данных в числах с плавающей точкой. 
Эти числа всегда приближенные. Грубо говоря даже какое-то целое число, типа 3, будет храниться как: 2.9999999999999999999.
Конкретно 3 будет иметь точное представление, но другие числа будут иметь приближенное представление. Поэтому работая с числами с плавающей точкой лучше всегда иметь ввиду, что это число приближенное.
Можете почитать что-нибудь по стандарту IEEE754 - стандарт чисел с плавающей точкой, который сейчас используется повсеместно. Так же в интернете есть сайты, где можно глазами увидеть как представляется то или иное число с плавающей точкой в компьютере. Например можете тут посмотреть: https://www.h-schmidt.net/FloatConverter/IEEE754.html
Если нужно округление до определенного кол-ва знаков после запятой, то вот это может помочь: 

Также есть вариант записывать число в std::stringstream с нужной точностью, а потом десериализовывать, но т.к. это затратно для этого случая не описал.
Похожие вопросы