Объявив переменную только с 2 десятичными точками в C

Я пытаюсь объявить переменную eLon только с 1 десятичным знаком, чтобы при наличии кода:

elon=359.8
printf("eLon = %f\n",eLon);

и на выходе будет

eLon = 359.8

Однако вывод, который я получаю:

eLon = 359.7999999.

Откуда я знаю, что могу изменить printf так, чтобы это было:

printf(eLon is %0.1f\n",eLon);

чтобы получить желаемый результат. Это НЕ то, что я хочу сделать. Я просто хочу, чтобы сама переменная имела только один десятичный знак, чтобы она равнялась 359,8, а не 359,7999999, поскольку это важно для любых вычислений, которые я делаю. Знаете ли вы, как я должен изменить свой код, чтобы получить желаемый результат. Я попытался сделать то, что было предложено в других запросах, но это не сработало, например, код:

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

int main()
{
    int endLonn;
    float endLon,eLon;
    endLon=359.8;
    endLonn=359.8*10;
    printf("%d is endLonn\n",endLonn);
    eLon= endLonn / 10;
    printf("elon is %f\n",eLon);
}

дает мне вывод:

elon is 359.00000000

Опять же, это тоже не то, что я ищу. Я хочу, чтобы Элон был 359,8. Если бы вы могли помочь мне настроить мой код, чтобы получить желаемый результат, это было бы здорово. Спасибо за ваше время.

4 ответа

Вместо того, чтобы пытаться обманывать double или float и printf, вы можете использовать арифметику с фиксированной точкой. В конкретном случае вашего примера вы будете выражать переменную в 0,1 с от ее первоначального значения:

int in_10s;
in_10s=3598;
printf("My fixed point variable "
       "represents %d.%01d value\n",
         in_10s/10, abs(in_10s % 10));

В общем случае n десятичных знаков формат для printf должен быть% d.% 0n d, где n=log_10(scaling_factor^-1), а коэффициент масштабирования интерпретируется как здесь.

Вам нужно не число с плавающей запятой, а десятичное число с фиксированной запятой, которое, например, доступно в C# как decimal, С не дает вам этого. Существует два "типичных" подхода для ролла:

  1. Используйте равнину int и просто иметь десятичную точку в некоторой позиции по соглашению. например, ваша ценность будет int elon=3598,

  2. Использовать struct с двумя целыми числами, один для целой части числа и один для количества десятых (или сотых, тысячных...)

В обоих случаях вам нужно будет реализовать собственную логику вывода. Простой подход с использованием равнины int по крайней мере, позволяет использовать обычную арифметику как обычно.

Я просто хочу, чтобы сама переменная имела только один десятичный знак, чтобы она равнялась 359,8, а не 359,7999999,

Вы должны использовать double:

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

int main(void){
    int endLonn;
    double endLon,eLon;
    endLon=359.8;
    endLonn=359.8*10;
    printf("%d is endLonn\n",endLonn);
    eLon = endLonn / 10;
    printf("elon is %.1lf\n%.1lf",eLon,endLon);
    return 0;
}

Выход:

3598 is endLonn
elon is 359.0
359.8

Вы на самом деле не можете объявить переменную, содержащую только одну десятичную цифру. Единственными нативными типами, способными представлять нецелые значения, являются типы с плавающей запятой, для которых любая арифметическая операция дает значение той же природы. Типы с плавающей точкой не могут быть ограничены фиксированным числом десятичных цифр.

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

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

Другие вопросы по тегам