Правильное использование std:: cout.precision() - не печатать конечные нули

Я вижу много вопросов о числе точности чисел с плавающей запятой, но особенно хочу знать, почему этот код

#include <iostream>
#include <stdlib.h>
int main()
{
  int a = 5;
  int b = 10;
  std::cout.precision(4);
  std::cout << (float)a/(float)b << "\n";
  return 0;
}

показывает 0.5? Я ожидаю увидеть 0.5000. Это из-за исходных целочисленных типов данных?

Ответы

Ответ 1

#include <iostream>
#include <stdlib.h>
#include <iomanip>
int main()
{
  int a = 5;
  int b = 10;
  std::cout << std::fixed;
  std::cout << std::setprecision(4);
  std::cout << (float)a/(float)b << "\n";
  return 0;
}

Вам нужно передать std::fixed манипулятор на cout, чтобы показать конечные нули.

Ответ 2

std::cout.precision(4); указывает максимальное количество цифр для использования не минимальное. это означает, например, если вы используете

precision 4 on 1.23456 you get 1.234  
precision 5 on 1.23456 you get 1.2345

Если вы хотите всегда получать цифры n, вам нужно будет использовать std::fixed.

Ответ 3

Поведение правильное. Аргумент указывает максимальное значение значащих цифр. Это не минимум. Если следовать только нулям, они не печатаются, потому что нули в конце десятичной части не имеют смысла. Если вы хотите напечатать нули, вам необходимо установить соответствующие флаги:

std::cout.setf(std::ios::fixed, std::ios::floatfield);

Это устанавливает обозначение "fixed", которое печатает все цифры.