如何在不截断小数的情况下在 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 来进行该操作。
查看一些有用的文档:
您应该使用 "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, ...}
中的数字。它们不能表示有理数。浮点数(或 float
s)表示有理数,在一定程度上是精确的。浮点数背后的数学有点复杂(我绝对不是专家),但基本上,它们可以让你表示最多小数点的有理数(由于计算机内存有限,无法表示无限多的小数)。 double
就像其他人提到的那样,几乎只是您可以指定的小数点数量的两倍。由于以前内存有限,因此通常使用 float
,但您可以使用 double
知道而不必太担心它 - 它会给您更好的计算结果。请注意,您可以 一些 特定问题 运行 使用 double
s 和 float
s 舍入和溢出以及各种疯狂的东西(其中如果你正在做更严肃的计算,你应该读一读),但一般来说,它们适用于大多数理性计算。
这两种数据类型的区别在于它们在内存中的表示方式,当转换为二进制时。计算机只能理解二进制,因此所有内容都需要翻译才能使用。您现在不需要知道详细信息,但从本质上讲,您选择的数据类型确实会有所不同。
那我该怎么办?
好吧,您必须知道要进行哪种计算,以及要将其用于什么目的。有时,您编程所用的语言会自动为您做出这种选择(或选择更强大的版本),但在 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%
之间也存在很大差异。
但是,如果您使用 double
s,情况就会不同。在这种情况下,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();
}
这会以正确的方式工作,您将在此过程中学到一些很酷的东西。祝你好运!
我正在用 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 来进行该操作。
查看一些有用的文档:
您应该使用 "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, ...}
中的数字。它们不能表示有理数。浮点数(或 float
s)表示有理数,在一定程度上是精确的。浮点数背后的数学有点复杂(我绝对不是专家),但基本上,它们可以让你表示最多小数点的有理数(由于计算机内存有限,无法表示无限多的小数)。 double
就像其他人提到的那样,几乎只是您可以指定的小数点数量的两倍。由于以前内存有限,因此通常使用 float
,但您可以使用 double
知道而不必太担心它 - 它会给您更好的计算结果。请注意,您可以 一些 特定问题 运行 使用 double
s 和 float
s 舍入和溢出以及各种疯狂的东西(其中如果你正在做更严肃的计算,你应该读一读),但一般来说,它们适用于大多数理性计算。
这两种数据类型的区别在于它们在内存中的表示方式,当转换为二进制时。计算机只能理解二进制,因此所有内容都需要翻译才能使用。您现在不需要知道详细信息,但从本质上讲,您选择的数据类型确实会有所不同。
那我该怎么办?
好吧,您必须知道要进行哪种计算,以及要将其用于什么目的。有时,您编程所用的语言会自动为您做出这种选择(或选择更强大的版本),但在 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%
之间也存在很大差异。
但是,如果您使用 double
s,情况就会不同。在这种情况下,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();
}
这会以正确的方式工作,您将在此过程中学到一些很酷的东西。祝你好运!