спецификатор формата для long double (я хочу обрезать 0 после десятичного числа) - PullRequest
2 голосов
/ 24 марта 2011

У меня есть 15-значное число с плавающей точкой, и мне нужно обрезать конечные нули после десятичной точки.Для этого есть спецификатор формата?

Ответы [ 5 ]

1 голос
/ 24 марта 2011

К сожалению, в C нет спецификатора формата, который соответствует всем вашим требованиям.%Lg - самый близкий, но, как вы заметили, он переключился на научную нотацию по своему усмотрению.%Lf не будет работать само по себе, потому что не удалит конечные нули.

Что вам нужно сделать, это вывести номер фиксированного формата в буфер, а затем вручную удалить нулиредактирование строк (что может быть ОЧЕНЬ сложно, если у вас есть ошибки округления и числа вроде 123.100000009781).

1 голос
/ 24 марта 2011
0 голосов
/ 15 августа 2013

%. 15g - 15 - максимальное количество значащих цифр, необходимое в строке (не количество десятичных знаков)

 1.012345678900000 => 1.0123456789
 12.012345678900000 => 12.0123456789
 123.012345678900000 => 123.0123456789
 1234.012345678900000 => 1234.0123456789
 12345.012345678900000 => 12345.0123456789
 123456.012345678900000 => 123456.012345679
0 голосов
/ 24 марта 2011

Вы можете напечатать спецификатор формата в виде строки, заполнив соответствующее количество цифр, если вы можете определить, сколько:

sprintf(fmt, "%%.%dlf", digits);
printf(fmt, number);

или просто проверить конечные 0 символов:

sprintf(fmt, "%.15lf", 2.123);
truncate(fmt);
printf("%s", fmt);

truncate(char * fmt) {
  int i = strlen(fmt);
  while (fmt[--i] == '0'  && i != 0);
  fmt[i+1] = '\0';
}
0 голосов
/ 24 марта 2011

Это то, что вы хотите:

#include <iostream>
#include <iomanip>

int main() 
{
     double doubleValue = 78998.9878000000000;
     std::cout << std::setprecision(15) << doubleValue << std::endl;
}

Вывод:

78998.9878

Обратите внимание, что конечные нули после десятичной точки усекаются!

Демонстрация в сети: http://www.ideone.com/vRFlQ

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