如何在不截断小数的情况下在 C++ 中存储数字?

How do I store numbers in C++ without the decimals being truncated?

我正在用 C++ 编写一个简单的百分比计算器。我是初学者,我无法弄清楚如何在不删除小数的情况下存储小数。如果我输入任何导致小数的输入,它会变为 0 并弄乱其余的计算。

#include <iostream>
using namespace std;
int main ()
{
 int a;
 int b;
 int c;
 int result;
 cout << "Enter your goal: ";
 cin >> a ;
 cout << "Enter the amount achieved: ";
 cin >> b ;
 c = b / a;
 result = c * 100;
 cout << result;
 cin.get();
} 

我知道问题出在整数 c 上,但我知道我需要做什么才能完成这项工作。我不知道为什么我在本应是一个简单的程序时遇到了麻烦。

查看基本数值类型:

int   -> integer numbers
float -> single precision floating point numbers
double-> double precision floating point numbers

您需要 float 或 double 来进行该操作。

查看一些有用的文档:

http://en.cppreference.com/w/cpp/language/types

https://en.wikipedia.org/wiki/C_data_types

您应该使用 "float" 或 "double" 类型来处理小数点数字。

您的代码的快速修复是将这些 int 类型变量更改为 "float"。

我还建议您阅读更多有关 C++ 的内容,例如 post http://www.cplusplus.com/doc/tutorial/variables/

您可能想使用类似这样的浮点运算:

double c = static_cast<double>(b) / a;

但如果您只想将百分比作为整数,请在 之前乘以 100 除:

int c = 100 * b / a;

试试这个(在将 b 除以 a 之前乘以 100):

#include <iostream>
using namespace std;
int main ()
{
 int a;
 int b;
 int c;
 int result;
 cout << "Enter your goal: ";
 cin >> a ;
 cout << "Enter the amount achieved: ";
 cin >> b ;
 c = b / a;
 result = b * 100 / a;
 cout << result;
 cin.get();
} 

如果不需要完美的四舍五入结果,最简单的方法是先乘以 100,然后除以 a

result = (b*100)/a;

如果您需要四舍五入的值,您可以先将所有 bei 10 相乘,然后手动对其进行四舍五入

result = (((b*10*100)/(a*10))+5)/10

此语句可以缩短,但我保留这种方式以使其更易于理解。

您最简单的方法是使用双精度值而不是整数。不过不知道是不是你的激烈

这看起来像是一个解决方案因错误原因而起作用的案例。就像@MikeCAT 在他的回答中说的那样,如果你先乘以 100,它就会“起作用”(即你得到的结果不是 0)。虽然这看起来像是一个解决方案,但它 不是 ,特别是因为乘法应该是可交换的,对吧?改变答案的因素顺序没有意义。 不应该

有效,对吧?

嗯,是的,也不是。您问题中的真正问题(就像其他人所说的那样)是您没有以正确的方式使用数据类型。据我了解,您没有太多编程经验,这很酷。欢迎来到编程!计算机是愚蠢的,当我说“愚蠢”时,我的意思是我的天哪,你是最愚蠢的机器,永远愚蠢。

一个数字并不总是一个数字

正如其他答案所提到的,在编程中处理数字的方式主要有两种(计算机非常笨,需要被告知使用哪一种):整数和浮点数。整数(您可能知道)代表集合 {0, 1, -1, 2, -2, ...} 中的数字。它们不能表示有理数。浮点数(或 floats)表示有理数,在一定程度上是精确的。浮点数背后的数学有点复杂(我绝对不是专家),但基本上,它们可以让你表示最多小数点的有理数(由于计算机内存有限,无法表示无限多的小数)。 double就像其他人提到的那样,几乎只是您可以指定的小数点数量的两倍。由于以前内存有限,因此通常使用 float,但您可以使用 double 知道而不必太担心它 - 它会给您更好的计算结果。请注意,您可以 一些 特定问题 运行 使用 doubles 和 floats 舍入和溢出以及各种疯狂的东西(其中如果你正在做更严肃的计算,你应该读一读),但一般来说,它们适用于大多数理性计算。

这两种数据类型的区别在于它们在内存中的表示方式,当转换为二进制时。计算机只能理解二进制,因此所有内容都需要翻译才能使用。您现在不需要知道详细信息,但从本质上讲,您选择的数据类型确实会有所不同。

那我该怎么办?

好吧,您必须知道要进行哪种计算,以及要将其用于什么目的。有时,您编程所用的语言会自动为您做出这种选择(或选择更强大的版本),但在 C++ 中,情况并非如此。在 C 和 C++ 中,您的编程比其他语言更接近计算机理解的内容,因此您在编程时通常必须更加具体(和谨慎)。这也是为什么使用 C 和 C++ 进行编程往往被认为比其他语言更难:为您自动化的事情更少。

在你的例子中,你可能并不真的想要整数。当您使用整数时,不可能使用小数。因此,当您除法时,例如 2 / 3,答案是 0(余数为 2)- 当您乘以 100 时,结果仍然是 0 .我们都知道它不是真的 0,但是计算机不能用int表示0.66。它就是不能。因此,它为您提供了最接近的东西,即 0。现在,如果您执行类似 100 * 2 / 3 的操作,那么答案将是 66.6...,表示为 66.6 丢失了,但答案不再是 0。所以,它看起来“有效”,但实际上并没有。即使对于百分比,66%66.66% 之间也存在很大差异。

但是,如果您使用 doubles,情况就会不同。在这种情况下,2 / 3 将是 0.6...,当您将 that 乘以 100 时,您将得到 66.6...,即正确答案。那将是 100 * 2 / 3.

完全相同的 结果

综合起来

因此,您的程序应如下所示:

#include <iostream>
using namespace std;
int main ()
{
 double a;
 double b;
 double c;
 double result;
 cout << "Enter your goal: ";
 cin >> a ;
 cout << "Enter the amount achieved: ";
 cin >> b ;
 c = b / a;
 result = c * 100;
 cout << result;
 cin.get();
} 

这会以正确的方式工作,您将在此过程中学到一些很酷的东西。祝你好运!