@H_403_1@当我写cout<< 3.0 / 2.0;
我得到1.5
但是当我写cout<< 3.0 * 2.0;
我得到6.
如果3.0和2.0是双值,我的结果不应该像6.0这样的双倍值吗?
根据int或double的结果是什么?
我得到1.5
但是当我写cout<< 3.0 * 2.0;
我得到6.
如果3.0和2.0是双值,我的结果不应该像6.0这样的双倍值吗?
根据int或double的结果是什么?
解决方法
3.0 * 2.0的结果非常多(a).但是,值的表示不是值.您会发现6,6.0,6.000000,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表达式/ 11):
Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type,which is also the type of the result. This pattern is called the usual arithmetic conversions,which are defined as follows:
@H_403_20@If either operand is of scoped enumeration type,no conversions are performed; if the other operand does not have the same type,the expression is ill-formed. If either operand is of type long double,the other shall be converted to long double. Otherwise,if either operand is double,the other shall be converted to double. Other irrelevant stuff in the context of this question.
(b)默认情况下打印的内容的实际规则在标准中指定,但复杂且区域设置足够大,以至于大多数人可能更容易进行显式格式化:-)