我目标是将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;
}
如果我能用循环来做就最好了,但如果不可能,我对其他建议持开放态度:)
4条答案
按热度按时间j2cgzkjk1#
这个问题在数学/逻辑意义上没有答案。你必须阅读浮点数在计算机中是如何工作的,见eidogg。
https://en.wikipedia.org/wiki/Floating-point_arithmetic
并了解它们在内存中不是小数点数字。内存中的浮点数由三个实际数字组成:
significant * base^{exponent}
并且根据IEEE,基本上在任何现代浮点数据中使用的基数都是“2”,但是在更一般的情况下,基数可以是任何值。因此,无论您在脑海中想到什么,甚至在屏幕上看到什么作为输出,都是内存中数据的误导性表示。因此,您的问题主要是对计算机中浮点数如何工作的误解...因此,你特别要求的东西一般不存在,也不可能做到。
然而,可能有输出格式的特殊应用程序,或者类似的东西可能有意义--但是特定的目标必须在这里的问题中清楚地陈述。在某些这样的情况下,使用“基于字符串”的方法,正如你所建议的,是可行的。但是这 * 不是 * 你的一般问题的答案,并且在将来也有很大的可能误导其他人。
实际上,让你的问题变得清晰明了的一个方法是指定一个固定的期望精度,即小数点后的数字,这样答案就简单而正确了:
long int value = fraction * pow(10, precision);
在这种情况下,你100%知道你在做什么。如果你真的喜欢,你可以随后从右边删除零...
**然而,**在数字层面上还有另一个原则问题:例如,
000003
和3
之间没有数学差异,因此在任何此类应用中,输入0.000003
将给予与0.0003
或0.3
等相同的结果。这不可能是期望的功能......询问浮点数. But, since we have a known
precision的小数部分的 * 值是非常无用的',我们可以这样做:其将填充最终丢失的前导零。
查看完整的测试代码
aiqt4smr2#
以下是一种可能的方法:
bzzcjhmw3#
比较双精度和整数部分的区别。只有当x小于2^63时才有效。
hsgswve44#
求2个真实的,求小于这些数的小数部分