c++11 - 从字符串转换为双精度无法按预期转换
问题描述
我正在尝试将“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
我在带有 gcc 的 centos 机器上尝试过,这个调用有效,但其他调用也失败了。
long double d2 = std::strtold("21898.99", nullptr); 因为它返回 21898.99
解决方案
这是浮点数的预期行为;有些值不能完全表示。
推荐阅读
- c# - 逻辑错误:“bsList()”列表意外更改大小
- ssl - OpenSSL 客户端身份验证失败,需要受信任的证书
- c# - C#:如何将 2 个列表放入一个 2 元组列表中
- c# - 使用 Unity3D 增强现实
- html - 我在 css 中 rtl 我的页面有问题,有人可以帮我吗?
- javascript - Gameloop不会匹配css动画
- sql - SQL 将 2 个字段拆分为行
- javascript - 为什么不使用任何光源就可以在 Three.js 中看到 3d 模型?
- kubernetes - 使用负载均衡器时在 kubernetes 日志中查看客户端 IP 地址
- javascript - Angular 4如何显示隐藏嵌套的表单组验证