如何在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
您需要浮点运算或双浮点运算。
查看一些有用的文档:
http://en.cppreference.com/w/cpp/language/types
https://en.wikipedia.org/wiki/C_data_types
这看起来像是一个解决方案因错误原因而工作的案例。就像@MikeCAT在他的回答中所说的那样,如果你先乘以100,它";作品";(即,您得到的结果不是0)。虽然这看起来像是一个解决方案,但它不是,尤其是因为乘法应该是交换的,对吧?按因素的顺序来改变答案是没有意义的。它不应该。
它有效,对吧
好吧,是的,也不是。你的问题中的真正问题(就像其他人所说的)是你没有以正确的方式使用数据类型。据我所知,你没有太多编程经验,这很酷。欢迎使用编程!计算机是愚蠢的,当我说";dumb";,我的意思是,天哪,你是有史以来最愚蠢的机器。
数字并不总是一个数字
正如其他答案所提到的,在编程中处理数字有两种主要方式(计算机太笨了,需要被告知使用哪一种):整数和浮点。整数(您可能知道)表示集合{0, 1, -1, 2, -2, ...}
中的数字。它们不能表示有理数。浮点数(或float
s)表示有理数,精确到一定程度。浮点运算背后的数学有点复杂(我绝对不是专家),但基本上,它们允许你表示一个多达小数点的有理数(由于计算机内存有限,不可能表示无穷多的小数)。double
和其他人提到的一样,几乎只是您可以指定的小数点数量的两倍。由于以前内存非常有限,所以使用float
是很常见的,但您可以使用double
而不用担心它,它会为您提供更好的计算结果。请注意,在double
和float
的舍入和溢出以及各种疯狂的东西(如果你正在进行更严肃的计算,你应该阅读这些)时,你可能会遇到一些特定的问题,但总的来说,它们对于大多数理性计算来说都很好。
这两种数据类型的区别在于它们在转换为二进制时在内存中的表示方式。计算机只懂二进制,所以所有的东西都需要翻译,这样他们才能使用它。你现在不需要知道细节,但从本质上讲,你选择的数据类型真的很重要。
那我该怎么办
好吧,你必须知道你想做什么样的计算,以及你想用它做什么。有时,编程语言会自动为您选择(或选择更强大的版本),但在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
,情况会有所不同。在这种情况下,2 / 3
将是0.6...
,当你将乘以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();
}
这将以正确的方式工作,在这个过程中你会学到一些很酷的东西。祝你好运
您应该使用"float"或"double"类型来处理小数点数字。
代码的一个快速修复方法是将那些int类型的变量更改为"float"。
我还建议你阅读更多关于C++的内容,比如这篇文章http://www.cplusplus.com/doc/tutorial/variables/
试试这个(在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,然后除以
result = (b*100)/a;
如果你需要一个四舍五入的值,你可以先乘以所有的bei10,然后手动四舍五进
result = (((b*10*100)/(a*10))+5)/10
这句话可以缩短,但我保持这种方式是为了更容易理解。
最简单的方法是使用双值而不是int。但我不知道这是否是你的密集
double c = static_cast<double>(b) / a;
但如果你只想把百分比作为一个整数,在之前乘以100:
int c = 100 * b / a;
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 获取数字小数部分的最佳方法
- C 如何在小数系统中添加两个数字
- 如何设置数字格式以显示C 中的所有小数位数
- 如何解析小数分离器为结肠的数字的字符串表示:
- 获取存储为字符串的数字的小数部分
- 将十进制数字截断为最接近的4个小数和断言
- C++不显示小数位数的数字
- C++ 将数字的小数部分转换为整数
- 显示带小数位数的数字,而不是整数
- 你如何在数字上添加 2 位小数
- 在小数秒内仅用 3 位数字格式化 posix 时间
- 如何从 9 和 90 中提取 2.9 和 2.09,即获取数字等于最大编号的小数部分.二分位数之后的数字
- 两个数字相减时的小数
- 如何在C++中存储数字而不截断小数
- 使用'int'数据类型时出错,即使数字不是小数
- 用两个小数求3个数字的平均值(不舍入!)
- 为什么小数后面的数字都是零
- 由正整数或正小数组成的字符串,转换为I数字格式
- 如何使用std::cout停止输出像5.0这样的数字的小数和零?