У меня есть двойное (или плавающее) число х:
х = 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 не должно быть никаких точек.
Было бы приятно услышать от вас.
Спасибо
Хайдер
Вот два способа сделать это.
Первый использует 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
Я предполагаю, что нет встроенных команд C / C ++ для этого, кроме 2 методов:
1) Используя приведенное выше, преобразовать в строку, а затем отсканировать обратно в 2 дюйма.
2) Доступ к содержимому памяти переменной памяти, а затем декодирование вручную.