我有一个双重(或漂浮)数字x:
x = 1234.5678;
现在,问题是,如何将数字分解为2个int,而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不应该有任何积分。
很高兴收到你的来信。
由于 海德
答案 0 :(得分:0)
以下是两种方法。
第一个使用std::stringstream
,std::string
和std::strtol
并且有点hacky。它也不是很有效,但它确实有效。
第二个需要知道小数位数并使用简单乘法。注意:此方法不会检查您传入的浮点数是否实际具有该小数位数。
这些方法都不是特别优雅,但它们对我测试的数字(正面和负面)都很有效。如果您发现错误/错误或者您有改进建议,请随意发表评论。
编辑:正如 @ 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
答案 1 :(得分:0)
我猜没有内置的C / C ++命令来执行此操作,除了以下两种方法:
1)使用上面的方法转换成字符串然后再扫描成2个整数。 2)访问存储器变量的存储器内容然后手动解码。