如何将双精度的分数部分变成整数?(C++)

  • 本文关键字:整数 C++ 数部 双精度 c++
  • 更新时间 :
  • 英文 :


我的目标是把一个双精度数的分数部分变成整数,例如:把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;
}

如果我可以用一个循环来做,那将是最好的,但如果不可能,我愿意接受其他建议:)

那个问题在数学/逻辑意义上没有答案。你必须了解计算机中的浮点数是如何工作的,例如

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 knownprecision '的小数部分的*值是毫无用处的,我们可以这样做:

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
}

这是一个可能的方法:

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

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

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

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

最新更新