我正在寻找一个返回数字小数部分的函数(但不像0.numbers),例如:
float x=12.3456;
我希望它返回:
int i=3456;
我试过
x=x-(int)x;
i=x;
但它返回0.;
答案 0 :(得分: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
取决于您想要的小数位数。更多零表示更多数字。
答案 1 :(得分: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.但该示例还显示了您遇到的问题:根据基础数据类型的数量和精度,您将获得不同的数字量,最终难以解释。因此,最有可能的是,获得固定数字的数字将是更好的解决方案。
答案 2 :(得分: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;
}