C ++如何正确地将const float舍入到unsigned int

时间:2014-11-19 01:21:12

标签: c++

所以我有一个const浮点数,范围从0.0到1.0。通过舍入或截断将这个转换为unsigned int的正确方法是什么?

这可以接受吗?

const float f=0.5f;
unsigned int i=static_cast<unsigned int>(f);

2 个答案:

答案 0 :(得分:4)

是的,如果您想要截断,并且如果您不关心负数或溢出会发生什么,那么这是完全可以接受的。

如果你想要四舍五入,先打电话给roundf(或者,如果你想要一个不同的“舍入规则”,那么请写下你自己的代码)。

如果您想处理负数或溢出,您需要在转换前进行检查。

根据标准中的5.2.9,在这种情况下static_cast被定义为给出与unsigned int i(f)相同的值。而且我认为大多数风格指南会同意static_cast是首选的(因为制作明确且明显的演员表通常是件好事。)

更详细:

根据4.9.1:

  

浮点类型的prvalue可以转换为整数类型的prvalue。转换转发;也就是说,丢弃小数部分。如果截断的值无法在目标类型中表示,则行为未定义。

我不确定const-away究竟是如何在C ++ 14中运行的,但我相信它不是一个限定转换,而是4.1.1中左值到右值转换的一部分:

  

非函数非数组类型T的glvalue(3.10)可以转换为prvalue ...如果T是非类类型,则prvalue的类型是T的非限定版本。 / p>

因此,f从左值const float到右值float有一个左值到右值的转换,然后是从float到{{1}的一次浮点积分转换},所以4.0.1是标准转换,所以5.2.9它有效unsigned int

答案 1 :(得分:3)

只需将一半添加到圆形:

unsigned int i = static_cast<unsigned int>(f + 0.5);

或者没有什么可以截断 - 你拥有的是好的(假设f >= 0

unsigned int i = static_cast<unsigned int>(f);