преобразовать из строки в двойное не удается преобразовать, как ожидалось - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь преобразовать «21898.99» в строку, но получаю 21898.990000000002, но ожидаю 21898.99

#include <cstdlib>
#include <boost/lexical_cast.hpp>
#include <limits>
#include <iostream>
int main()
{
    double d1 = std::strtod("21898.99", nullptr);
    long double d2 = std::strtold("21898.99", nullptr);
    float d3 = std::strtof("21898.99", nullptr);

    double d4 = atof("21898.99");

    double d5 = boost::lexical_cast<double>("21898.99");

    double d6;  
    sscanf_s("21898.99", "%lf", &d6);

    double d7;
    sscanf_s("21898.99", "%lg", &d7);

    std::istringstream ss("21898.99");
    double d8 = 0.0;
    ss >> d8;

    typedef std::numeric_limits< double > dbl;
    std::cout.precision(dbl::max_digits10);
    std::cout << d1 << "\n";
    std::cout << d2 << "\n";
    std::cout << d3 << "\n";
    std::cout << d4 << "\n";
    std::cout << d5 << "\n";
    std::cout << d6 << "\n";
    std::cout << d7 << "\n";
    std::cout << d8 << "\n"; 
}

Выход:

21898.990000000002
21898.990000000002
21898.990234375
21898.990000000002
21898.990000000002
21898.990000000002
21898.990000000002
21898.990000000002

Windows 10 версия 10.0.14939.0
Visual Studio 2017 15.9.0, C ++ 19.15.26732.1
Windows SDK 10.0.17134.0

Я пробовал на машине centos с gcc, и этот вызов работает, но другие также не работают.
long double d2 = std :: strtold ("21898.99", nullptr); так как он возвращает 21898,99

1 Ответ

0 голосов
/ 14 ноября 2018

Это ожидаемое поведение для чисел с плавающей запятой; некоторые значения не совсем представимы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...