如何在 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++ 没有指数运算符吗?^
没有做你想做的事。
正如错误所解释的,科学计数法产生double
s。如果您确定您的值可以表示为 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 自定义远程验证器
如何在struct中正确定义一个函数指针,它以struct为指针?