首页 > 解决方案 > C++ 在数学计算中将 double 转换为 int

问题描述

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

标签: c++

解决方案


的结果3.0 * 2.0很大程度上(a)。然而,价值的呈现并不是价值。你会发现 , 6, 6.0, 6.00000,0.06E2甚至6000E-3符号都是相同的值,不同的表现形式-6(epi×i)

如果您不想要默认表示(b),则iostream和标头具有以特定iomanip格式格式化数字的功能,例如使用它来获取: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。
  • 否则,如果任一操作数为双精度,则另一个应转换为双精度。
  • 在这个问题的背景下其他不相关的东西。

(b)默认情况下打印的实际规则在标准中指定,但足够复杂和区域设置感知,大多数人可能更容易进行显式格式化:-)


推荐阅读