Объявив переменную только с 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
, С не дает вам этого. Существует два "типичных" подхода для ролла:
Используйте равнину
int
и просто иметь десятичную точку в некоторой позиции по соглашению. например, ваша ценность будетint elon=3598
,Использовать
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
Вы на самом деле не можете объявить переменную, содержащую только одну десятичную цифру. Единственными нативными типами, способными представлять нецелые значения, являются типы с плавающей запятой, для которых любая арифметическая операция дает значение той же природы. Типы с плавающей точкой не могут быть ограничены фиксированным числом десятичных цифр.
Чтобы достичь того, о чем вы просите, вы должны либо реализовать такое поведение, либо использовать существующую реализацию того, что называется аэрметикой с фиксированной точкой.
Довольно полное введение можно найти в арифметической записи Википедии с фиксированной точкой. В конце вы найдете несколько библиотек, реализующих его.