为什么该类型为double而不是float?

lim*_*ade 3 c++ floating-point language-lawyer implicit-conversion

问题:在一项家庭作业问题中(必须用笔在纸上完成,因此无需编码),我必须确定用C ++执行的加法的类型和值。

1 + 0.5
Run Code Online (Sandbox Code Playgroud)

我已经回答的是:

  • 输入float(因为我以为是integer + float = float
  • 值1.5(据我所知,当添加两个不同的数据类型时,相加的结果将转换为不会丢失任何信息的数据类型。)

解决方案说:

  • 类型:双
  • 价值:1.5

我的问题:为什么0.5是两倍而不是浮点数?如何区分浮点数和双精度数?我的意思是,0.5在我看来就像是浮点数和两倍。

inf*_*inf 7

在C ++中,double默认情况下不带类型后缀的浮点文字。如果需要,则float需要指定f后缀,如0.5f


Chi*_*ter 7

首先,是的。integer+ float= float。您对那部分是正确的。

问题不在于此,而在于您的假设0.5float。它不是。在C ++中,浮点字面量后跟一个f0.5f表示浮点数。但是,0.5实际上是一个double。这意味着您的等式现在为:

integer + double = double
Run Code Online (Sandbox Code Playgroud)

如您所见,此结果是两倍。这就是为什么对您的问题的正确答案是结果类型为double的原因。


顺便说一句,为了清除记录,从技术上讲,这里没有发生什么integer + double = double。发生的事情是即将1接受隐式转换。本质上,将1a转换为a double,因为操作的另一面也是a double。这样,计算机将添加相同类型而不是不同类型。这意味着此处实际发生的添加更像是:

double + double = double
Run Code Online (Sandbox Code Playgroud)