Десятичные неправильные в C

я реализую проект в C, появилась тема, что я надеюсь, что сообщество может помогать мне.

Я использую десятичные числа в частности тип информации - Float. Напечатав мой output я вижу, что C он делает вид округления. Например:

Числа, которое он был бы должен печатать.0751632 и он печатает.0800000

Форма, в которой я печатаю:

printf("%f\n",aux_no->rutas[y]);

Переменная "aux_no" - структура с array "маршрутами" как один из Ваших членов, этот array - типа float.

Не, если бы он был должен изменять Double тип информации?

Как я могу делать для того, чтобы он прекратил округлять таким образом?

Благодаря всем из-за того, что читает.

0
задан 25.01.2019, 05:35
5 ответов

array, который ты определяешь внутри внутри твоей структуры, должен быть тип double:

 double rutas[] = {91.023, 0.0751632, 2.03, 3.432, 7.023};

, напечатав это, ты можешь делать это, как ты это выдвигаешь в твоем вопросе:

for(int y = 0; y<5; y++){
    printf("%f\n",rutas[y]);
}

с этим ты заверяешь в том, что печатаешь желанную стоимость:

 0.0751632
2
ответ дан 03.12.2019, 22:38

Кажется, нет способа воспроизводить этот эффект

#include<stdio.h>

int main(){    

typedef struct aux_no_st{    
    float rutas[10];    
} aux_no_t;

aux_no_t aux_no_var;    
aux_no_var.rutas[1]= 0.0751632;    
aux_no_t *aux_no=&aux_no_var;   
int y=1;    
printf("%f",aux_no->rutas[1]);    
}

Я получаю этот результат

0.075163

ВїPodrГ-Схвати тестировать это и видеть, продолжает ли он происходить?

1
ответ дан 03.12.2019, 22:38

Поведение в C на типе float и double - тот же самый, будет выполнять тебя то же округление.

В книжном магазине math.h http://www.gnu.org/software/libc/manual/html_node/Rounding-Functions.html ты можешь видеть различные доступные функции округления. Какие-то примеры:

#include <math.h>

float val =  0.751632;

float rounded_down = floorf(val * 1000) / 1000;   /* Result: 0.751 */
float nearest = roundf(val * 1000) / 1000;  /* Result: 0.752 */
float rounded_up = ceilf(val * 1000) / 1000;      /* Result: 0.752 */

, Если этого не достаточно, ты будешь должен делать твою собственную функцию для такого эффекта.

0
ответ дан 03.12.2019, 22:38

Правильный формат, чтобы определять точность, использованную из-за printf() он:

%f.(n-decimales)

В твоем случае он был бы:

printf("%f.7\n",aux_no->rutas[y]);

С этим были бы видны 7 десятичных числа, которое ты разместил примера.

Но еще не определяя стоимости 7, стандартная настройка - 6 десятичных а следовательно ты был бы должен получать

0.075163

Следовательно ошибка с округлением или форматом находится более назад вероятно в ассигновании в array.

0
ответ дан 03.12.2019, 22:38

Округление - тема, которая затрудняется для тех, которые начинаются в этом мире. То, за чем оно последует, состоит в том, что точность float низкая, что показывает, что, сделав несколько операций, ошибку, которая накапливается, растет и ведет в результаты, которые различаются в высшей степени от реального результата. Взамен, переменные double дают нам возможность содействовать немного этой проблеме, так как количество бит, которые берутся за то, чтобы манипулировать частью точности double, - почти двойная порция тех float, следовательно, он, из-за muuucho, более точный. especificador превращения, ассоциируемый с double - %lf.

0
ответ дан 03.12.2019, 22:38