C ++在数学计算中将double转换为int

时间:2018-10-30 08:04:40

标签: c++

当我写cout<<3.0/2.0;时 我得到1.5 但是当我写cout<< 3.0*2.0;时 我得到6。 如果3.0和2.0是双精度值,我的结果是否应该是像6.0这样的双精度值? 根据结果​​是int还是double?

2 个答案:

答案 0 :(得分:9)

3.0 * 2.0的结果非常很多一个双(a)。但是,值的表示不是值。您会发现66.06.000000.06E26000E-3甚至符号-6(epi×i)都是 值相同,但显示方式不同。

如果您不希望使用默认的演示文稿(b),则iostreamiomanip标头具有在 specific 中格式化数字的功能。格式,例如使用此格式获取6.0

#include <iostream>
#include <iomanip>
int main() {
    auto x = 3.0 * 2.0;
    std::cout << std::setprecision(1) << std::fixed << x << '\n';
}

(a)标准中指定的常用算术转换在这里起作用(例如C++17 8 Expressions /11):

  

许多期望算术或枚举类型的操作数的二进制运算符都以类似的方式引起转换并产生结果类型。目的是产生一个通用类型,它也是结果的类型。这种模式称为通常的算术转换,定义如下:

     
      
  • 如果任何一个操作数都属于范围枚举类型,则不执行任何转换;如果另一个操作数的类型不同,则表达式格式错误。
  •   
  • 如果其中一个操作数的类型为long double,则另一个应转换为long double。
  •   
  • 否则,如果其中一个操作数为double,则另一个应转换为double。
  •   
  • 与此问题相关的其他不相关内容。
  •   

(b)默认情况下,要打印的实际规则在标准中指定,但是很复杂,并且对语言环境有所了解,因此大多数人可能更容易进行显式格式化:-)

答案 1 :(得分:4)

在C ++中很好地定义了来自给定算术运算的输出数据类型的规则。您可以使用typeid在编译时找到它。

std::cout << typeid(3.0 * 2.0).name() << std::endl; // Prints 'd' for double instead of 'i' for integer

您可能会惊讶地发现,将一个数据类型(char)的两个值相加会导致输出不同数据类型:

std::cout << typeid('a'+'b').name() << std::endl; // Prints 'i' for integer instead of 'c' for character

在这种情况下,您明确声明2.0和3.0是浮点类型。毫不奇怪,结果也是浮点类型。但是,cout实用程序省略了小数点,因为结果是整数。