整理整洁[bugprone-incorrect-roundings]的文档说:
数字0.499999975(小于0.5的最小可表示浮点数)四舍五入为1.0
据我所知,socket.io
以下的最小浮点数是0.5
,而不是0.4999999702
。但是尽管如此,天真的舍入计算中的两个数字give me 0
values:
0.499999975
我想念什么吗?
答案 0 :(得分:3)
关于标准中的算术转换:
6.3.1.8常规算术转换
...
否则,如果一个操作数的对应实型为double,则将另一个操作数转换为对应实型为double的类型,而不会改变类型域。
与类型所要求的精度和范围相比,浮点操作数的值和浮点表达式的结果的表示精度可能更高;
所以在这一行:
(int)(v1+0.5)
您的v1
变量被提升为双精度浮点运算,这就是为什么您得到零的原因。
这应该可以解决您的问题:
#include <iostream>
int main() {
const float v1 = 0.499999975f;
const float v2 = 0.4999999702f;
std::cout << (int)(v1 + 0.5f) << "\n"
<< (int)(v2 + 0.5f) << "\n";
}