2016-02-28 4 views
-3

Я ищу функцию, которая возвращает DECIMALS часть числа (но не нравится 0.numbers), например:Десятичная часть в C++;

float x=12.3456; 

Я хочу его вернуть:

int i=3456; 

I исп.

x=x-(int)x; 
i=x; 

Но он возвращает 0.;

+3

Существует не всегда четкое количество десятичных цифр, так как число с плавающей точкой, как правило, представляется в виде (эквивалент) доли целых чисел а/Ь, где Ъ сила 2. Но вы можете сделать это, указав * количество цифр, которое вы хотите. Например, для 5 цифр умножьте десятичную часть на 10 000 и преобразуйте в целое число. –

ответ

1

Давайте эти два присваивания один за другим

x=x-(int)x; 
i=x; 

Сначала вы делаете x=x-(int)x что приведет к x равна 0.346. Затем вы делаете i=x, который усекает (т. Е. Удаляет десятичные знаки) значения x, приводя к i, становящемуся нулевым.

Вам нужно умножить x на 1000 до назначения на i:

i = 1000 * x; 

Число 1000 зависит от количества цифр после десятичной точки, которые вы хотите. Больше нулей означает больше цифр.

+0

Итак, я должен создать функцию, которая возвращает (например, int e) размер X, , а затем умножить x на 10^e; – Gabriel

1

Чтобы добавить Joachim Pileborg's answer: если вы действительно хотите иметь все дробные числа в вашем целое число, вы могли бы сделать что-то вроде этого:

#include <iostream> 
#include <iomanip> 
#include <limits> 
#include <cmath> 

template <typename T> 
long long fractional(T val) 
{ 
    T frac = val - std::floor(val); 
    long long alldigits(std::pow(10, std::numeric_limits<T>::digits10)*frac); 
    while (alldigits%10 == 0) 
    { 
    alldigits /= 10; 
    } 
    return alldigits; 
} 

int main() 
{ 
    std::cout << fractional<float>(1.0/8.0) << std::endl; // 125 
    std::cout << fractional<float>(1.0/3.0) << std::endl; // 333333 
    std::cout << fractional<double>(1.0/3.0) << std::endl; // 333333333333333 
    return 0; 
} 

Live example here. Но пример показывает также проблемы, которые вы хотите запустить в: в зависимости от количества и точности базового типа данных вы получите разные количества цифр, которые в конечном итоге трудно интерпретировать. Скорее всего, получение фиксированного количества цифр будет лучшим решением.

1

вы могли бы попробовать это:

#include <iostream> 


int intpart(float x) { 
    float b = 0; 
    x -= (int)x; 
    while (x - (int)x != 0) 
     x *= 10; 
    return (int)x; 
} 

int main(int argc, char const *argv[]) 
{ 
    std::cout << intpart(17.5) << std::endl; 
    return 0; 
} 
Смежные вопросы