Извлечение десятичной части из числа с плавающей запятой в C - PullRequest
41 голосов
/ 01 февраля 2009

Как мы можем извлечь десятичную часть числа с плавающей запятой и сохранить десятичную часть и целую часть в две отдельные целые переменные?

Ответы [ 14 ]

0 голосов
/ 03 ноября 2016

Если вы просто хотите получить первое десятичное значение, решение действительно простое.

Вот пояснительный пример:

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, что является значением в правой части десятичной точки. Таким образом, используйте модуль.

Эту технику можно использовать для получения следующих десятичных знаков, используя, например, 100 вместо 10 и т. Д.


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

0 голосов
/ 27 ноября 2014

Вот еще один способ:

#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

}

http://codepad.org/jyHoBALU

Выход:

whole: 123 
mantissa: 4567
0 голосов
/ 26 сентября 2013

Я сделал эту функцию, похоже, работает нормально:

#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));
}
0 голосов
/ 08 июля 2011

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

...