将 float 转换为 int,还是将 int 转换为 float?
Posted
技术标签:
【中文标题】将 float 转换为 int,还是将 int 转换为 float?【英文标题】:Cast float to int, or int to float? 【发布时间】:2016-05-31 12:38:56 【问题描述】:我可以将常量定义为浮点数或 32 位 uint:
const float SecondsPerMinute = 60.0F;
或
const uint32 SecondsPerMinute = 60U;
const 用于一些需要整数的方程和一些需要浮点数的方程。我想让我的编译器和静态分析工具满意,所以我会根据需要将其静态转换为适当的类型。
将 const 定义为 float 并转换为 int 更好,还是将其定义为 int 并转换为 float 更好?有什么不同吗,还是这更多的是个人意见?
假设常量与 int 和 float 的使用次数相同。
【问题讨论】:
如果您需要添加无用的转换来将 60u 转换为 60f,您的静态分析工具将无济于事。 如果您将其定义为浮点数,那么在每个需要整数的方程中,您将其转换为整数,反之亦然。那么,为什么不定义两个常量,一个用于 int,另一个用于 float,并根据需要使用它们呢?如果不比任何其他替代方案更好,这肯定会提供相同的性能。唯一的缺点是您的代码大小会增加。 在任一方向的转换中都不会丢失信息(两种表示都是准确的)。并且在任何一个方向都不需要演员表。所以根本无所谓。 我同意在这种简单的情况下,静态分析工具可能会造成不必要的复杂化,但它们的目的是揭示可能导致意外行为的情况。在 int 与 float 的情况下,当预期为 int 时,您可能会通过使用 float 合法地失去精度。只是说... :) 当然:但是如果值是一个常量 - 并且一个可以精确表示为 int 或 float 的常量 - 那么没有警告是合理的。 【参考方案1】:模板怎么样:
template <typename T>
constexpr T SecondsPerMinute = T(60);
用法:
std::printf("%d %f", SecondsPerMinute<int>, SecondsPerMinute<double>);
【讨论】:
这很棒。我花了最后 10 分钟尝试做同样的事情,最后我得到了 10 多行不工作的代码。谢谢! 我认为这是一个很好的解决这个问题的方法,并且可以扩展到许多类似的场景。谢谢! 还是隐式转换为 int 和 float 的类?以上是关于将 float 转换为 int,还是将 int 转换为 float?的主要内容,如果未能解决你的问题,请参考以下文章