如何在 C++ 中正确定义包含科学记数法的整数向量?

Posted

技术标签:

【中文标题】如何在 C++ 中正确定义包含科学记数法的整数向量?【英文标题】:How to define an integer vector containing scientific notation correctly in C++? 【发布时间】:2017-06-07 17:34:41 【问题描述】:

代码

#include <iostream>
#include <vector>

int main ()  std::vector<int> N = 3e6, 4e6; 

报错

error: narrowing conversion of ‘3.0e+6’ from ‘double’ to ‘int’ inside   [-Wnarrowing]|||.

#include <iostream>
#include <vector>

int main () 
   std::vector<int> N = 3*10^6, 4*10^6;
   for (int n: N ) std::cout << n << std::endl; 

打印

24
46.

如何正确定义这个向量为整数向量?

如果在写这个问题的时候发现那个设置

int n1 = 3e6, n2 = 4e6;
vector<int> N = n1, n2;

确实有效,但有更好的方法吗?在 n1 和 n2 的声明中,类型仍然从 double 转换为 int。

【问题讨论】:

你知道 C++ 没有指数运算符吗? ^ 没有做你想做的事。 正如错误所解释的,科学计数法产生doubles。如果您确定您的值可以表示为 int,您可以将它们转换为 int @NeilButterworth 是的,我知道在做了上面的例子之后。我认为它可能对像我这样的其他菜鸟有用,他们以后可能会偶然发现这个问题,所以也把它写下来。 【参考方案1】:

如果您坚持使用该表示法,您可以执行显式强制转换来关闭编译器,但这不是一个好主意:

#include <iostream>
#include <vector>

int main ()  std::vector<int> N = int(3e6), int(4e6); 

【讨论】:

你能解释一下为什么这不是一个好主意吗?在我看来,3e6 的优势在于与 3e7 相比,3000000 和 30000000 更容易区分。当然,3'000'000 是 c++14 的实现方式... @Andre 因为像int(3e21) 这样的东西在没有警告的情况下编译,但几乎可以肯定不会做你期望的事情。 @Andre 告诉编译器停止强制转换绝不是一个好主意。它通常会隐藏问题但不能解决问题。 我的观点和@Andre 一样,认为一定有更好的方法,不会被所有的零搞糊涂。

以上是关于如何在 C++ 中正确定义包含科学记数法的整数向量?的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 4 中正确实现 Parsley.js 自定义远程验证器

我是不是在 C++ 中正确实现了欧拉方法?

如何在struct中正确定义一个函数指针,它以struct为指针?

如何在 models.py 文件中正确定义 ManyToMany 字段

如何在 Keras 中正确实现自定义活动正则化器?

如何在.Net中正确实现自定义计时器