C ++ функция stof приведена к целому числу - PullRequest
2 голосов
/ 21 марта 2019
#include <iostream>

int main() 
{ 
    int val = std::stof("4.99") * 100; 

    std::cout << val; 

    return 0; 
}

Я пробовал другие строки, и все они, кажется, конвертируются правильно, но я не уверен, что происходит за кулисами, что приводит к выводу 498 вместо 499. В моем случае каждая строка имеет максимум 2 десятичных знаков.

Ответы [ 2 ]

5 голосов
/ 21 марта 2019

ближайший IEEE754 float до 4.99 равен 4.9899997711181640625. std::stof вернет последнее.

Это умноженное на 100 равно 498.999969482421875, которое усекается до 498.

Это одна из ловушек арифметики с плавающей запятой, я боюсь; Вы должны быть очень осторожны при использовании прерывистой функции, такой как преобразование float в int; использование std::lround для результата будет работать в вашем конкретном случае.

Дальнейшее чтение: Математика с плавающей запятой не работает?

2 голосов
/ 21 марта 2019

Используйте правильную функцию, которая будет правильно округлять число с плавающей запятой:

#include <cmath>
#include <iostream>
int main() 
{ 
    auto val = std::lround(std::stof("4.99") * 100);

    std::cout << val; 

    return 0; 
}
...