Преобразование остатка с плавающей запятой / double в int

У меня есть двойное (или плавающее) число х:

х = 1234,5678;

Теперь вопрос в том, как разбить число на 2 целых, тогда как int1 получит число до точки, а int2 — число после точки.

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

т.е. чтобы расширить приведенный выше пример:

float x = 1234.5678;
int x1 = (int) x;   // which would return 1234 great.
int x2 = SomeFunction????(x);            // where I need x2 to become = 5678

Обратите внимание, что у 5678 не должно быть никаких точек.

Было бы приятно услышать от вас.

Спасибо
Хайдер

1

Решение

Вот два способа сделать это.

Первый использует std::stringstream, std::string а также std::strtol и это Сорта Хаки. Это также не очень эффективно, но это делает работу.

Второй должен знать количество десятичных знаков и использует простое умножение. ПРИМЕЧАНИЕ. Этот метод не будет проверять, имеет ли фактически переданное вами число с плавающей точкой такое количество десятичных знаков.

Ни один из этих методов не является особенно элегантным, но они хорошо работают для тестируемых мной чисел (как положительных, так и отрицательных). Не стесняйтесь комментировать, если вы обнаружите ошибки / ошибки или если у вас есть предложения по улучшению.

РЕДАКТИРОВАТЬ: Как @ dan04 указал, что этот метод будет возвращать то же значение для 0.4 что касается 0.04, Если вы хотите отличить их, вам понадобится вторая int для хранения числа нулей после десятичной точки.

#include <iostream>
#include <sstream>
#include <math.h>

int GetDecimalsUsingString( float number );
int GetDecimals( float number, int num_decimals );

int main() {
float x = 1234.5678;
int x1 = (int) x;   // which would return 1234 great.
float remainder = x - static_cast< float > ( x1 );
std::cout << "Original : " << x << std::endl;
std::cout << "Before comma : " << x1 << std::endl;
std::cout << "Remainder : " << remainder << std::endl;

// "Ugly" way using std::stringstream and std::string
int res_string = GetDecimalsUsingString( remainder );

// Nicer, but requires that you specify number of decimals
int res_num_decimals = GetDecimals( remainder, 5 );

std::cout << "Result using string : " << res_string << std::endl;
std::cout << "Result using known number of decimals : " << res_num_decimals << std::endl;
return 0;
}

int GetDecimalsUsingString( float number )
{
// Put number in a stringstream
std::stringstream ss;
ss << number;

// Put content of stringstream into a string
std::string str = ss.str();

// Remove the first part of the string ( minus symbol, 0 and decimal point)
if ( number < 0.0 )
str = str.substr( 3, str.length() - 1);
else
str = str.substr( 2, str.length() - 1);

// Convert string back to int
int ret =  std::strtol( str.c_str(), NULL, 10 );

/// Preserve sign
if ( number < 0 )
ret *= -1;

return ret;
}
int GetDecimals( float number, int num_decimals )
{
int decimal_multiplier = pow( 10, num_decimals );
int result = number *  decimal_multiplier;

return result;
}

Выход :

Original : 1234.57
Before comma : 1234
Remainder : 0.567749
Result using string : 567749
Result using known number of decimals : 56774

Ideone

0

Другие решения

Я предполагаю, что нет встроенных команд C / C ++ для этого, кроме 2 методов:

1) Используя приведенное выше, преобразовать в строку, а затем отсканировать обратно в 2 дюйма.
2) Доступ к содержимому памяти переменной памяти, а затем декодирование вручную.

0

По вопросам рекламы [email protected]