C의 부동 소수점 숫자에서 소수점 부분을 추출하는 방법은 무엇입니까?
부동 소수점 숫자의 소수점을 추출하여 소수점과 정수점을 두 개의 개별 정수 변수로 저장하려면 어떻게 해야 합니까?
이것을 시험해 보세요.
int main() {
double num = 23.345;
int intpart = (int)num;
double decpart = num - intpart;
printf("Num = %f, intpart = %d, decpart = %f\n", num, intpart, decpart);
}
다음과 같은 이점을 얻을 수 있습니다.
Num = 23.345000, intpart = 23, decpart = 0.345000
그게 당신이 원하는 것처럼 보이는군요
를 사용합니다.modf기능:
double integral;
double fractional = modf(some_double, &integral);
정수로 캐스팅할 수도 있지만 정수가 오버플로될 수 있습니다.그럼 결과는 예측할 수 없어요.
가장 명확한 대답은 다음과 같습니다.
#define N_DECIMAL_POINTS_PRECISION (1000) // n = 3. Three decimal points.
float f = 123.456;
int integerPart = (int)f;
int decimalPart = ((int)(f*N_DECIMAL_POINTS_PRECISION)%N_DECIMAL_POINTS_PRECISION);
원하는 소수점 수를 변경할 수 있습니다.N_DECIMAL_POINTS_PRECISION니즈에 맞게.
부동수를 사용하여 플로어 값을 빼서 소수 부분을 가져옵니다.
double fractional = some_double - floor(some_double);
이것에 의해, 정수로의 타이핑이 방지됩니다.부동수가 너무 커서 정수치에 포함할 수 없는 경우 오버플로가 발생할 수 있습니다.
또한 음수 값의 경우 floor()는 입력값 이하의 최대 정수값을 계산하기 때문에 이 코드는 부동수의 양의 소수 부분을 제공합니다.
float num;
int intgPart;
float fracPart;
printf("Enter the positive floating point number: ");
scanf("%f", &num);
intgPart = (int)num;
fracPart = num - intgPart;
소수 부분은 원래의 이중값에서 적분 부분을 빼서 얻을 수 있습니다.
더블 플로트를 사용하여 서브루틴을 생성했는데 2개의 정수값을 반환합니다.
void double2Ints(double f, int p, int *i, int *d)
{
// f = float, p=decimal precision, i=integer, d=decimal
int li;
int prec=1;
for(int x=p;x>0;x--)
{
prec*=10;
}; // same as power(10,p)
li = (int) f; // get integer part
*d = (int) ((f-li)*prec); // get decimal part
*i = li;
}
void test()
{
double df = 3.14159265;
int i,d;
for(int p=2;p<9;p++)
{
double2Ints(df, p, &i,&d); printf("d2i (%d) %f = %d.%d\r\n",p, df,i,d);
}
}
또 다른 방법은 다음과 같습니다.
#include <stdlib.h>
int main()
{
char* inStr = "123.4567"; //the number we want to convert
char* endptr; //unused char ptr for strtod
char* loc = strchr(inStr, '.');
long mantissa = strtod(loc+1, endptr);
long whole = strtod(inStr, endptr);
printf("whole: %d \n", whole); //whole number portion
printf("mantissa: %d", mantissa); //decimal portion
}
출력:
whole: 123
mantissa: 4567
데이터가 String 형식일 때 문제를 해결하는 것이 가장 좋은 방법일 수 있습니다.데이터가 String일 경우 소수점에 따라 해석할 수 있습니다.적분과 10진수를 Substrings로 추출하여 실제 정수로 변환합니다.
이 기능을 만들었습니다만, 정상적으로 동작하고 있는 것 같습니다.
#include <math.h>
void GetFloattoInt (double fnum, long precision, long *pe, long *pd)
{
long pe_sign;
long intpart;
float decpart;
if(fnum>=0)
{
pe_sign=1;
}
else
{
pe_sign=-1;
}
intpart=(long)fnum;
decpart=fnum-intpart;
*pe=intpart;
*pd=(((long)(decpart*pe_sign*pow(10,precision)))%(long)pow(10,precision));
}
예를 들어 A가 정수이고, 그 다음에 (int)A가 정수이고, 다른 하나는 정수 부분이고, 여기서 n은 유지할 소수점 수입니다.
cout<<"enter a decimal number\n";
cin>>str;
for(i=0;i<str.size();i++)
{
if(str[i]=='.')
break;
}
for(j=i+1;j<str.size();j++)
{
cout<<str[j];
}
이 경우 소수점 이하 자리수를 모르기 때문에 문자열을 사용하는 것이 올바른 방법이라고 생각합니다.단, @SingleNegationElimination에서 설명한 바와 같이 모든 케이스(1.005)에 대해 동작하는 것은 아닙니다.이에 대한 제 의견은 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char s_value[60], s_integral[60], s_fractional[60];
int i, found = 0, count = 1, integral, fractional;
scanf("%s", s_value);
for (i = 0; s_value[i] != '\0'; i++)
{
if (!found)
{
if (s_value[i] == '.')
{
found = 1;
s_integral[i] = '\0';
continue;
}
s_integral[i] = s_value[i];
count++;
}
else
s_fractional[i - count] = s_value[i];
}
s_fractional[i - count] = '\0';
integral = atoi(s_integral);
fractional = atoi(s_fractional);
printf("value = %s, integral = %d, fractional = %d\n",
s_value, integral, fractional);
return 0;
}
나도 어떻게 할까 생각중이었어.하지만 방법을 찾았어요이 코드를 사용해 보세요.
printf("Enter a floating number");
scanf("%d%c%d", &no, &dot, &dec);
printf("Number=%d Decimal part=%d", no, dec);
출력:-
Enter a floating number
23.13
Number=23 Decimal part=13
첫 번째 10진수 값만 얻으려면 해결책은 매우 간단합니다.
다음으로 설명 예를 제시하겠습니다.
int leftSideOfDecimalPoint = (int) initialFloatValue; // The cast from float to int keeps only the integer part
int temp = (int) initialFloatValue * 10;
int rightSideOfDecimalPoint = temp % 10;
예를 들어 초기 부동값이 27.8이라고 가정합니다.
- 초기 부동값을 int에 캐스팅하는 것만으로 분수 부분은 폐기하고 정수 부분만 유지합니다.
- 초기 플로트 값에 10을 곱하면 278.0의 결과를 얻을 수 있으며, 이 결과를 int에 캐스팅하면 278의 값을 얻을 수 있습니다.
- 278을 10으로 나누면 27.8이 되고 나머지는 소수점 오른쪽의 값인 8이 됩니다.따라서 계수를 사용합니다.
그런 다음 이 기술을 사용하여 10이 아닌 100을 사용하는 등 다음과 같은 10진수 문자를 얻을 수 있습니다.
7 세그먼트 디스플레이에 표시하는 등 실시간시스템에서 이 기술을 사용하면 플로트 값을 곱하기 때문에 올바르게 동작하지 않을 수 있습니다.플로트 값을 곱하면 오버헤드가 많이 걸립니다.
#include <stdio.h>
Int main ()
{
float f=56.75;
int a=(int)f;
int result=(f-a)*100;
printf ("integer = %d\n decimal part to integer
=%d\n",result);
}
Output:-
integer =56
decimal part to integer = 75
언급URL : https://stackoverflow.com/questions/499939/how-to-extract-the-decimal-part-from-a-floating-point-number-in-c
'programing' 카테고리의 다른 글
| Vue 컴포넌트 데이터 변수 이름에 동적으로 액세스 (0) | 2022.08.24 |
|---|---|
| 직접 DOM조작하지 않고 d3-axis을 그리세요. (0) | 2022.08.22 |
| @워치 데코레이터가 활성화되지 않음 (0) | 2022.08.22 |
| Vue에서 여러 구성 요소를 렌더링할 수 없음 (0) | 2022.08.22 |
| 이름 선행 HTML 요소의 Vue 오류 "알 수 없는 사용자 지정 요소"를 방지하는 방법 (0) | 2022.08.22 |