如何将一个双精度浮点数的小数部分转换成整数?(c++)

pdsfdshx  于 2022-11-19  发布在  其他
关注(0)|答案(4)|浏览(170)

我目标是将double的小数部分转换为整数,例如:将0.854转换为854或将0.9321转换为9321(双精度浮点数的整个部分始终为0)
我是这样做的,但是我不知道如何填充while的参数,使它在变量x变成没有分数的整数时停止:

double x;
cin >> x;
while(WHAT DO I TYPE HERE TO MAKE IT STOP WHEN X BECOMES A WHOLE NUMBER){
x *= 10;
}

如果我能用循环来做就最好了,但如果不可能,我对其他建议持开放态度:)

j2cgzkjk

j2cgzkjk1#

这个问题在数学/逻辑意义上没有答案。你必须阅读浮点数在计算机中是如何工作的,见eidogg。
https://en.wikipedia.org/wiki/Floating-point_arithmetic
并了解它们在内存中不是小数点数字。内存中的浮点数由三个实际数字组成:significant * base^{exponent}并且根据IEEE,基本上在任何现代浮点数据中使用的基数都是“2”,但是在更一般的情况下,基数可以是任何值。因此,无论您在脑海中想到什么,甚至在屏幕上看到什么作为输出,都是内存中数据的误导性表示。因此,您的问题主要是对计算机中浮点数如何工作的误解...
因此,你特别要求的东西一般不存在,也不可能做到。
然而,可能有输出格式的特殊应用程序,或者类似的东西可能有意义--但是特定的目标必须在这里的问题中清楚地陈述。在某些这样的情况下,使用“基于字符串”的方法,正如你所建议的,是可行的。但是这 * 不是 * 你的一般问题的答案,并且在将来也有很大的可能误导其他人。
实际上,让你的问题变得清晰明了的一个方法是指定一个固定的期望精度,即小数点后的数字,这样答案就简单而正确了:
long int value = fraction * pow(10, precision);
在这种情况下,你100%知道你在做什么。如果你真的喜欢,你可以随后从右边删除零...

int nTrailingZeros = 0;
while (value%10 == 0) {
   value /= 10;
   ++nTrailingZeros;
}

**然而,**在数字层面上还有另一个原则问题:例如,0000033之间没有数学差异,因此在任何此类应用中,输入0.000003将给予与0.00030.3等相同的结果。这不可能是期望的功能......询问浮点数. But, since we have a known precision的小数部分的 * 值是非常无用的',我们可以这样做:

cout << setw(precision-ntrailing) << setfill('0') << value << endl;

其将填充最终丢失的前导零。
查看完整的测试代码

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

int main() {

  double v = 0.0454243252;
  int precision = 14;
  
  long int value = v*pow(10,precision);

  cout << value << endl;
  // 4542432520000

  int nTrailingZeros = 0;
  while (value%10 == 0) {
    value /= 10;
    ++nTrailingZeros;
  }

  cout << value << endl;
  // 454243252

  cout << setw(precision-ntrailing) << setfill('0') << value << endl;
  // 0454243252
}
aiqt4smr

aiqt4smr2#

以下是一种可能的方法:

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;

int main()
{
    cout << "Enter Number: ";
    double user_input;
    cin >> user_input;

    int user_input_to_int = int(user_input);
    double decimal_value = user_input - user_input_to_int;

    ostringstream oss;
    oss << std::noshowpoint << decimal_value;
    string num_str = oss.str();
    int str_length = num_str.size()-2;

    int multiplier = 1;
    for (int x = 0; x < str_length; x++)
    {
        multiplier *= 10;
    }
    
    cout << "\n";
    cout << "Whole number: " << user_input_to_int << endl;
    cout << "Decimal value: " << decimal_value*multiplier << endl;
}
bzzcjhmw

bzzcjhmw3#

比较双精度和整数部分的区别。只有当x小于2^63时才有效。

while (x - long long(x) > 0)
hsgswve4

hsgswve44#

求2个真实的,求小于这些数的小数部分

相关问题