Вопрос

У меня есть массив с плавающей точкой, где данные хранятся с различными десятичными запятыми, поэтому некоторые из них 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 );
}

Другие советы

Я не знаю, насколько это банально, но:

http://codepad.org/e3Q3pUNd

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 конечные нули не удаляются из результата.[...]

...но вы получаете конечные нули:(

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top