Как printf или iostream определяют максимальное количество цифр после точки - PullRequest
3 голосов
/ 06 марта 2012

Какой формат строки в операторе printf или iomanip в iostream, я должен использовать для печати числа в следующем формате:

  • 125.0 => 125
  • 125.1 => 125.1
  • 125.12312 => 125.12
  • 1.12345 => 1.12
  • 1234.1235 => 1234.12

Короче, печатать не более 2 цифр послеточка, но удалите все завершающие нули.

Я пытался %.2f, но не работает, потому что он печатает 125.00 и 125.10 для первых 2 случаев.

Ответы [ 6 ]

2 голосов
/ 06 марта 2012

iostream использует flags .

В частности, используйте std::cout << std::setprecision(5), чтобы установить точность 5. См. setprecision и ios_base :: precision .

Если вы установите точность, без установки fixed , она будет использовать указанную вами точность без конечных нулей. Если вы также установите флаг fixed, он будет печатать конечные нули с заданной вами точностью.

printf также использует свои собственные флаги. См. документацию о том, как ее использовать.

1 голос
/ 06 марта 2012

Похоже, я разобрался с простой работой:

void print(float f) {
  f = floor(f * 100.0f + 0.5f) / 100.0f;
  cout << f;
}

решит большинство распространенных случаев. Единственное, что не может быть решено, это f> 10e7, который cout напечатает f в научном представлении.

1 голос
/ 06 марта 2012

Нет способа указать это.Вы можете указать точное количество цифр после десятичного знака (чтобы при необходимости добавлялись нули) или максимальное количество значащих цифр, но не максимальное количество цифр после десятичного знака.

ПРИМЕЧАНИЕ.Xeo первым ответил на это в комментарии.

1 голос
/ 06 марта 2012

Это поведение с плавающей запятой по умолчанию для iostream. Просто установите точность до максимального количества цифр (в вашем примере 5) и выводите в поток в обычном режиме.

0 голосов
/ 07 марта 2012

Попробуйте это:

char buf[5];
int l = snprintf(buf, sizeof buf, "%.2f", x);
if (!strcmp(buf, "0.00")) printf("0\n");
else printf("%.*g\n", l-1, x);
0 голосов
/ 06 марта 2012

Для этой цели семейство printf имеет формат %g (но в некоторых случаях он также имеет целью изменить% f в% e). Как указывает Джеймс, это поведение по умолчанию в C ++ IOStream; сбросить его, если он был изменен на что-то другое:

#include <iostream>
#include <iomanip>
#include <stdio.h>

int main()
{
    printf("%.2g %.2g\n", 1.2, 0.0000012);
    std::cout << std::fixed << std::setprecision(2) << 1.2 << " " << 0.0000012 << '\n';
    std::cout.setf(std::ios_base::fixed|std::ios_base::scientific, std::ios_base::floatfield);
    std::cout << std::setprecision(2) << 1.2 << " " << 0.0000012 << '\n';
}

дает

1.2 1.2e-06
1.20 0.00
1.2 1.2e-06
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...