Относительно арифметического преобразования в стандарте:
6.3.1.8 Обычные арифметические преобразования
...
В противном случае, еслисоответствующий действительный тип любого из операндов является двойным, другой операнд преобразуется без изменения области типов в тип, соответствующий действительный тип которого является двойным.
Значения плавающих операндов ирезультаты плавающих выражений могут быть представлены с большей точностью и в диапазоне, чем требуется для типа;
Итак, в этой строке:
(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";
}