C ++中的小数部分;

时间:2016-02-28 12:15:32

标签: c++

我正在寻找一个返回数字小数部分的函数(但不像0.numbers),例如:

float x=12.3456;

我希望它返回:

int i=3456;

我试过

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

但它返回0.;

3 个答案:

答案 0 :(得分:1)

让我们逐一进行这两项任务

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

首先,您x=x-(int)xx等于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;
}