c ++ - 为什么分配两个int在分配给double时不会产生正确的值?

为什么在下面的代码片段中呢?

int a = 7;
int b = 3;
double c = 0;
c = a / b;

int/int=double最终得到的值是2,而不是2.3333,正如人们所期望的那样。 如果ab是双打,答案确实转为2.333。 但肯定是因为c已经是双倍应该与整数一起工作?

那怎么来int/int=double怎么办?

Jahoe asked 2019-09-11T10:01:29Z
8个解决方案
137 votes

这是因为您使用的是operator/的整数除法版本,需要2 int并返回int.要使用double版本(返回double),必须至少将其中一个int显式转换为double

c = a/(double)b;
Chad La Guardia answered 2019-09-11T10:01:47Z
11 votes

这里是:

a)除两个=s总是执行整数除法。 因此,您的情况下=的结果只能是=

如果您想将==保持为=并完全除以它们,则必须至少将其中一个投入双倍:intdoublec

b)==,因此它可以接受=分配值:int自动转换为double并分配给c

c)请记住,在分配时,首先计算=右侧的表达式(根据上述规则(a),而不考虑=左侧的变量),然后将其分配给=左侧的变量( 根据上述(b))。 我相信这样就完成了。

nplatis answered 2019-09-11T10:02:36Z
9 votes

除了极少数例外(我只能想到一个),C ++决定了表达式(或子表达式)的全部含义本身。 你用表达式的结果做什么并不重要。在您的情况下,在表达式a / b中,没有double in视线; 一切都是int.所以编译器使用整数除法。只有结果才会考虑如何处理它,并且将其转换为double

James Kanze answered 2019-09-11T10:03:07Z
6 votes

当你除以两个整数时,结果将是一个整数,而不管你将它存储在一个double中。

Alok Save answered 2019-09-11T10:03:37Z
5 votes

a/b是一个double变量,但赋给它的值是int值,因为它是由两个ints的除法产生的,它给出了“整数除法”(丢弃余数)。 那么在c=a/b行中会发生什么

  1. 评估a/b,创建一个double类型的临时
  2. 转换为类型double后,临时值被分配给a/b

不会参考其上下文(指派double)确定a/b的值。

Fred Foo answered 2019-09-11T10:04:32Z
4 votes

/运算符可用于整数除法或浮点除法。 你给它两个整数操作数,所以它进行整数除法,然后结果存储在一个double中。

Vicky answered 2019-09-11T10:05:06Z
4 votes

在C ++语言中,subexpresison的结果不会受到周围环境的影响(有一些罕见的例外)。 这是该语言所遵循的原则之一。 表达式c = a / b包含独立子表达式a / b,其独立于子表达式之外的任何内容进行解释。 该语言不关心您以后将结果分配给double. a / b是整数除法。 其他任何事都无所谓。 您将在语言规范的许多角落看到这个原则。 这就是C ++(和C)的工作方式。

我在上面提到的异常的一个例子是在函数重载的情况下的函数指针赋值/初始化

void foo(int);
void foo(double);

void (*p)(double) = &foo; // automatically selects `foo(fouble)`

这是一个上下文,其中赋值/初始化的左侧影响右侧的行为。 (此外,引用数组初始化可防止数组类型衰减,这是类似行为的另一个示例。)在所有其他情况下,右侧完全忽略左侧。

AnT answered 2019-09-11T10:06:01Z
2 votes

这在技术上是依赖于语言的,但几乎所有语言都对此主题的处理方式相同。 当表达式中的两种数据类型之间存在类型不匹配时,大多数语言将尝试根据一组预定义规则将数据转换为double var = double result的一侧以匹配另一侧的数据。

当划分两个相同类型的数字(整数,双精度等)时,结果将始终是相同的类型(因此'int / int'将始终导致int)。

在这种情况下,你有double var = double result在计算之后将整数结果转换为double,在这种情况下,小数数据已经丢失。 (大多数语言都会执行此操作以防止类型不准确而不会引发异常或错误)。

如果您希望将结果保持为双倍,那么您将希望创建一个您拥有的情境double var = double result

最简单的方法是强制等式右边的表达式转换为double:

a

在整数和双精度之间进行划分将导致将整数转换为double(请注意,在进行数学运算时,编译器通常会“向上”到最具体的数据类型,这是为了防止数据丢失)。

在上调之后,a将成为双倍,现在你有两个双打之间的区分。 这将创建所需的划分和分配。

再说一遍,请注意这是特定于语言的(甚至可以是特定于编译器的),但几乎所有语言(当然我能想到的所有语言)都完全相同。

matthewdunnam answered 2019-09-11T10:07:25Z
translate from https://stackoverflow.com:/questions/7571326/why-does-dividing-two-int-not-yield-the-right-value-when-assigned-to-double