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

时间:2015-12-05 14:30:19

标签: c++ calculator

我正在用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是问题所在,但我知道我需要做些什么来使这项工作。我不知道为什么我在应该是一个简单的程序时遇到麻烦。

6 个答案:

答案 0 :(得分:2)

查看基本数字类型:

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

答案 1 :(得分:0)

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

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

我还建议您阅读有关C ++的更多信息,例如此帖http://www.cplusplus.com/doc/tutorial/variables/

答案 2 :(得分:0)

您可能希望使用浮点运算,例如:

{{1}}

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

{{1}}

答案 3 :(得分:0)

尝试此操作(在将100除以b之前乘以a):

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

答案 4 :(得分:0)

最简单的方法,如果你不需要一个完美的舍入结果,首先要乘以100然后再除以

result = (b*100)/a;

如果你需要一个舍入值,你可以先将所有bei 10相乘,然后手动将其舍入

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

这个陈述可以缩短,但我保持这种方式,以便更容易理解。

你最简单的方法是使用double值而不是int。但我不知道这是不是你的激烈

答案 5 :(得分:0)

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

它有效,对吗?

嗯,是的,不。你问题中的真正问题(就像其他人说的那样)是你没有以正确的方式使用数据类型。据我所知,你没有太多的编程经验,这很酷。欢迎编程!计算机是愚蠢的,当我说'愚蠢&#34;时,我的意思是哦 - 我 - 上帝 - 你是愚蠢的机器 - 曾经愚蠢。

数字并不总是一个数字

正如其他答案所提到的,在编程中有两种主要处理数字的方法(计算机是如此愚蠢以至于需要告诉他们使用哪一种):整数和浮点数。整数(您可能知道)用于集合{0, 1, -1, 2, -2, ...}中的数字。他们不能代表有理数。浮点数(或float s)代表有理数,达到一定程度的精确度。浮点数背后的数学有点复杂(我绝对不是专家),但基本上,它们允许你表示一个有理数到多个小数点(因为计算机内存有限,不可能表示无限小数)。 double和其他人一样,只是你可以指定的小数点数的两倍。由于之前内存受到更多限制,因此通常使用float,但您可以使用double而不必担心它 - 而且它会为您提供更好的计算结果。请注意,您可以遇到一些特定问题,doublefloat的舍入和溢出以及各种疯狂的东西(如果您和#,您应该阅读这些内容) 39;重新做更严肃的计算),但总的来说,它们适用于大多数理性计算。

这两种数据类型之间的区别在于它们在转换为二进制时在内存中的表示方式。计算机只能理解二进制文件,所以一切都需要翻译,以便他们可以使用它。您现在不需要了解详细信息,但实质上,您选择的数据类型确实会产生影响。

那我该怎么办?

嗯,你必须知道你想要做什么样的计算,以及你想用它做什么。有时,您编程的语言会自动为您选择(或选择功能更强大的版本),但在C ++中,情况并非如此。在C和C ++中,编程比其他语言更接近计算机所理解的程度,编程时通常必须更加具体(并且小心)。这也是为什么C和C ++中的编程往往被认为比其他编程更难的原因:为您自动化的东西越来越少。

在你的情况下,你可能并不真正想要整数。使用整数时,不可能使用小数。因此,当您划分时,例如2 / 3,答案为0(余下的2) - 当您乘以100时仍为0 。我们都知道它不是真的 0,但计算机无法在0.66中代表int。它不能。所以,它给你最接近的东西,即0。现在,如果您执行100 * 2 / 3之类的操作,则答案为66.6...,表示为66.6已丢失,但答案不再是0。所以,它出现到&#34; work&#34;,但它确实没有。即使是百分比,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();
} 

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