我的代码,简而言之,归结为:
int x = 5;
x *= 0.5;用Visual Studio编译它,我得到了一个关于可能丢失数据的警告C4244 -当然,因为(简化)整型乘以双精度会导致双精度型,然后将其转换为整型,丢失非整数部分。
我的问题是,是否有C++语法来表明这是预期的行为,以便使警告静默(我知道杂注推送/弹出以禁用警告,我认为更清楚地表明这实际上是预期的行为,并且我不仅仅是抑制警告)。
长格式将在乘法后显式转换,如下所示:
x = (int)(x * 0.5);但复合运算符表示法更易于阅读。
那么,有没有办法像这样投射呢?我试着把"(int)“放在我能想到的每一个位置,但似乎没有一个是有效的C++ :(
发布于 2012-06-06 22:47:08
不是乘以0.5,而是除以2。对于两个int,将使用整数除法,并且不会出现警告。
如果你真的想乘以浮点数/双精度数,不要使用int来存储结果。
发布于 2012-06-06 22:53:01
警告已经到位-应该警告您可能会丢失数据。
任何避免警告的方法都需要使用清楚表达意图的语法。这可以通过以下方式完成:
x = static_cast<int>(x * 0.5);使用一元运算符*,您不能轻松抑制警告,因为该运算符的目的是以一种明确而直接的方式使用,而不涉及强制转换-而您的情况不符合这一要求。所以你不能这样做是一件好事。
发布于 2012-06-06 23:04:57
根据OP的评论,最好的建议是根据您想要的舍入行为(有偏/无偏),使用<cmath>中适当的函数。
例如,floor通常会进行偏向舍入(偏向于负无穷大,因为它总是选择较小的整数),例如,floor( -7.5 )会给你-8,如果你想要对称舍入,你需要自己滚动,即希望floor( -7.5 )为-7 (就像floor( 7.5 )提供7一样)。
但是,可以对round进行调整,以产生无偏舍入。通常,它将从round( 10.3 )生成10,从round( 10.6 ) (或更大)生成11。中间四舍五入(tie-breaking)仍然存在问题,即round( 10.5 )应该提供什么(它通常会产生11)。以防这种行为不适合你,你可能想看看一些替代方案,如/等。
https://stackoverflow.com/questions/10916584
复制相似问题