Форматирование с плавающей запятой в printf()
-
16-09-2019 - |
Вопрос
У меня есть массив с плавающей точкой, где данные хранятся с различными десятичными запятыми, поэтому некоторые из них 123.40000
, 123.45000
, 123.45600
...теперь, если я хочу напечатать эти значения в строке без 0 в конце в printf()
так что они являются 123.4
, 123.45
, 123.456
, без этих нулей в конце.Возможно ли это?Если да, то каким образом?
Решение
Используйте форматировщик %g:
printf( "%g", 123.4000 );
С принтами
123.4
Конечные нули удаляются, но, к сожалению, так же удаляется и конечная десятичная точка, если дробная часть равна нулю.Я не знаю, есть ли на самом деле какой-либо способ сделать то, что вы хотите, напрямую, используя printf() - я думаю, что что-то вроде этого, вероятно, ваш лучший выбор:
#include <stdio.h>
#include <math.h>
void print( FILE * f, double d ) {
if ( d - floor(d) == 0.0 ) {
fprintf( f, "%g.", d );
}
else {
fprintf( f, "%g", d );
}
}
int main() {
print( stdout, 12.0 );
print( stdout, 12.300 );
}
Другие советы
Я не знаю, насколько это банально, но:
float f = 124.000;
if (f == (int) f) {
printf("%.1f\n", f); /* .1 can be changed */
} else {
printf("%g\n", f);
}
ВОЗВРАТ 124.0
.
float f = 124.123000;
if (f == (int) f) {
printf("%.1f\n", f); /* .1 can be changed */
} else {
printf("%g\n", f);
}
ВОЗВРАТ 124.123
.
Использование, %г --
Выведите значение double либо в обычной, либо в экспоненциальной системе счисления, в зависимости от того, что больше подходит для его величины.в "g" используются строчные буквы, в "G" - заглавные.Этот тип немного отличается от обозначения с фиксированной запятой тем, что незначительные нули справа от десятичной точки не включаются.Кроме того, десятичная точка не включается в целые числа.
Печать в (достаточно большой) буфер.Распечатайте буфер ...и если там нет '.'
в буфере выведите точку.
char buf[100];
sprintf(buf, "%g", val);
printf("%s", buf);
if (strchr(buf, '.') == NULL) putchar('.');
Редактировать
Стандарт определяет #
Отметить:
# Результат преобразуется в `альтернативную форму".[...] Для преобразований a, A, e, E, f, F, g и G. Результат преобразования с плавающей запятой число всегда содержит символ с десятичной запятой, даже если за ним не следует ни одной цифры это.[...] Для преобразований g и G конечные нули не удаляются из результата.[...]
...но вы получаете конечные нули:(