2015-12-18 4 views
4

Существует много вопросов и ответов о десятичном & целочисленном извлечении из чисел с плавающей запятой и выводе результатов для некоторых определенных десятичных точек. Но никто не смог решить мою проблему. Пожалуйста, если кто-нибудь может помочь мне решить мою проблему.Как получить точную дробную часть из числа с плавающей запятой в виде целого числа?

Я действительно пытался извлечь точную дробную часть из числа с плавающей запятой. Я пробовал с этим:

float f=254.73; 

    int integer = (int)f; 
    float fractional = f-integer; 

    printf ("The fractional part is: %f", fractional); 

Но выход: 0.729996. По этой причине, когда я это делал:

float f=254.73; 

    int integer = (int)f; 
    float fractional = f-integer; 
    int fractional_part_in_integer = ((int)(f*100)%100); 

    printf ("The value is: %d", fractional_part_in_integer); 

Это дает мне 72 в качестве выхода. Но я хочу извлечь точно 73 из заданного числа 254.73. Я уже знаю, как использовать %.2f во время функции printf() для печати до двух десятичных чисел. Но в моем коде я не хочу печатать номер прямо сейчас. У меня есть некоторые вычисления с этой дробной частью как целочисленная форма, т. Е. 73. Итак, моя проблема заключается в том, как я мог извлечь дробную часть из 254.73, чтобы я мог получить точную сумму 73 как целое, чтобы делать больше вычислений?

Надеюсь, я мог бы понять это всем.

+4

Номера плавающей запятой не могут быть представлены как значение _exact_, которое вы хотите, чтобы они были в значительной части времени. Ваши результаты разумны. Потенциально интересный эксперимент заключается в том, чтобы напечатать значение 'f', которое может быть только близко к тому, что вы думаете (хотя я не устал сам, поэтому не уверен). UPDATE: Я пробовал: http: // ideone.com/9fbeme – mah

+0

Спасибо. Но, надеюсь, должен быть способ сделать некоторые другие вычисления с 73 там. UPDATE: Да, я уже сделал это и получил то значение, которое вы нашли в своем эксперименте. –

+2

Поскольку ваше оборудование не может точно представлять 254,73, вам нужно либо найти другое оборудование, которое может, либо использовать вычисления на основе целых чисел (например, с '25473' и делить на 100 позже). – mah

ответ

0

Самый простой способ заключается в использовании стандартной функции библиотеки ceil из <math.h>.
Номер float254.73 может быть преобразован в 254.7299957275390625000000.
f-integer даст 0.7299957275390625000000.
Теперь умножьте его на 100 и используйте функцию ceil, чтобы получить наименьшее целое значение не менее 72.99957275390625000000.

int fractional_part_in_integer = ((int)ceil(fractional*100)) % 100; 
+0

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

+0

* при нажатии на целое я снова получаю предыдущее значение *: Я не понимаю, о чем вы говорите? – haccks

+0

Я действительно указывал на свой главный вопрос. Из 254.73 я хотел извлечь 73 только в целочисленной форме. Согласно вашему предоставленному коду, я получаю выход 0.730000, это хорошо. Но когда я попытался преобразовать его в целое число «int fractional_part_in_integer = ((int) (f * 100)% 100); , снова я получил 72, но я хотел получить 73 –

6

Как получить точную дробную часть из числа с плавающей точкой в ​​виде целого числа?

Использование modf()

MODF функции разбить значение аргумента в целой и дробной части, ... C11 §7.12.6.12 2

#include <math.h> 

double value = 1.234; 
double ipart; 
double frac = modf(value, &ipart); 

Лучше подход для потребности ОП может состоять в том, чтобы округлить сначала, а масштабированное значение, а затем обратно в целые и дробные части.

double value = 254.73; 
value = round(value*100.0); 

double frac = fmod(value, 100); 
double ipart = (value - frac)/100.0; 

printf("%f %f\n", ipart, frac); 
254.000000 73.000000 

Ссылка деталь: Когда ОП использует 254.73, это преобразуется в ближайший float значение, которое может быть 254.729995727539....

float f = 254.73; 
printf("%.30f\n", f); 
// 254.729995727539062500000000000000 
+2

Неужели это не даст те же результаты, что и OP? – mah

+1

@mah. Нет. Метод OP имеет проблемы с '(int) f; fractional = f-integer; 'когда' f' не соответствует диапазону 'int', 2)' f' отрицательно 3) 'int' имеет меньшую точность, чем' f'. Второй метод OP, скорее всего, дал неудовлетворительный результат s с такими значениями, как 1.99999 – chux

+0

Без проверки, но только учитывая ваши рассуждения, я считаю, что ваши конкретные варианты использования являются вескими причинами использования вашего совета 'fmod()' ..., но с учетом фактического значения OP использует, 254.73, если ваш совет не разрешит его дилемму (а именно: он рассчитывает вернуться .73, а не .7299996), я думаю, что ваш пост - прекрасный комментарий, но не ответ. Я открыт, чтобы показать, почему я могу ошибаться. – mah

Смежные вопросы