C++;中的小数部分

Decimal part in C++;

本文关键字:小数部 C++      更新时间:2023-10-16

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

float x=12.3456;

我希望它返回:

int i=3456;

我试过了

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

但它返回 0。

;

让我们一一完成这两个作业

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

首先,您执行x=x-(int)x这将导致x等于0.346。然后,您执行截断(即删除小数)x值的i=x,导致i变为零。

您需要在分配给i之前将x乘以 1000

i = 1000 * x;

1000数取决于所需的小数位数。更多的零意味着更多的数字。

补充一下Joachim Pileborg的答案:如果你真的想在你的整数中拥有所有的小数位数,你可以做这样的事情:

#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;
}

活生生的例子在这里。 但该示例还显示了您遇到的问题:根据基础数据类型的数量和精度,您将获得不同数量的数字,最终难以解释。 因此,最有可能的是,获得固定数量的数字将是更好的解决方案。

你可以试试这个:

#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;
}