2012-05-09 6 views
1

Какую строку одного формата можно использовать для печати 0.0, 1.0, 0.025? например Дано:Спецификатор одиночного формата C/C++ для печати 0.0, 1.0, 0.025

float vals[3] = { 0.0f, 1f, 0.025f }; 

for(int i=0; i < 3; i++) 
    printf("%g\n", vals[i]); 

желаемый результат:

0.0 
1.0 
0.025 

, но вместо того, чтобы получить:

0 
1 
0.025 

Пытались различной ширины спецификаторов и% F% против г, но не может получить то, что я хочу ,

Если есть альтернатива C++, это нормально.

+0

Try 'setprecision'. Он находится в '', который имеет больше форм форматирования на C++. – chris

ответ

1

Вы можете использовать *, чтобы сообщить printf, что точность будет получена из значения аргумента int.

printf("%.*f\n", (vals[i] == (int)vals[i]) ? 1 : 3 ,vals[i]); 

должен напечатать:

0.0 
1.0 
0.025 
+0

достаточно близко, хотя и пошел с printf ("% g% s \ n", vals [i], ((vals [i] == (int) vals [i])? ".0": "")); так что я не теряю точность – hanlonj

2

Вы можете использовать setprecision (int n), где n - количество десятичных знаков для вывода. Любые конечные нули не будут отображаться, если не использовать фиксированные нотации

#include <iostream> 
#include <iomanip> 

float vals[3] = { 0.0f, 1.0f, 0.025f }; 
std::cout << setprecision(5); 
for(int i=0; i < 3; i++) 
std::cout << vals[i]; 

Выход

0.0 
1.0 
0.025 

Измените следующие для фиксированного обозначения

cout << setprecision(5) << fixed; 

Выход

0.00000 
1.00000 
0.02500 

редактирования: Существует также sc но вы можете понять, что это делает.setprecision() ---> std :: setprecision()

+0

Вы забыли указать пространство имен std. ('std :: cout') – SigTerm

+0

ОП запросил« 0.0 »,« 1.0 »,« 0.025 ». Не «0.00000», «1.00000», «0.02500». – Wiz

+0

Спасибо Сиг, исправлено. Я показал оба метода Wiz. – Jordonias

2

Вы можете указать точность после запятой для чисел с плавающей запятой и удваивается при ее печати. Это делается с помощью спецификатора формата, например:% .Nf, где N - положительное целое число. Так что если вы использовали:

printf("%.3f\n", vals[i]); 

Ваш выход:

0.000 
1.000 
0.025 

Но вы не можете получить его, чтобы распечатать его именно так, как вы объявили его. Вам нужно будет изменить точность на разных этапах цикла (% .1f для первых 2 итераций, а затем% .3f для последней итерации). Есть много вариантов Printf включая ведущие пространства, а также:

http://pubs.opengroup.org/onlinepubs/009695399/functions/printf.html

редактировать:

Так что, если вы хотите иметь как минимум 1 знак после запятой, напечатанных как вы объяснили в своем комментарии вы может добавить явную проверку для этого одного случая:

#include <math.h> 
#include <stdio.h> 

int 
main(int argc, char *argv[]) { 
    float vals[3] = { 0.0f, 1.0f, 0.025f }; 

    for(int i=0; i < 3; i++) { 
    if(fmod(vals[i],1) == 0) printf("%.1f\n", vals[i]); 
    else printf("%f\n", vals[i]); 
    } 

    return 1; 
} 

Выход:

0.0 
1.0 
0.025000 
+0

yep im осведомлен о различных спецификаторах. просто не мог выработать комбинацию, чтобы получить то, что я хочу. не обязательно должен быть «объявлен» только с минимальным значением «.0». кажется странным, если это невозможно, хотя ... – hanlonj

 Смежные вопросы

  • Нет связанных вопросов^_^