将词法强制转换双倍提升为字符串,给出无效结果
boost lexical cast double to string giving invalid results
我正在尝试这个:
std::cout << boost::lexical_cast<std::string>(0.0009) << std::endl;
并期望输出为:
0.0009
但输出是:
0.00089999999999999998
g++ 版本: 5.4.0, 加速版本: 1.66
我能做些什么来让它打印它被给予的东西。
实际上,您可以覆盖默认精度:
住在科里鲁
#include <boost/lexical_cast.hpp>
#ifdef BOOST_LCAST_NO_COMPILE_TIME_PRECISION
# error unsupported
#endif
template <> struct boost::detail::lcast_precision<double> : std::integral_constant<unsigned, 5> { };
#include <string>
#include <iostream>
int main() {
std::cout << boost::lexical_cast<std::string>(0.0009) << std::endl;
}
指纹
0.0009
但是,这既不支持(detail::
(,也不灵活(现在所有双打都将以这种方式出现(。
真正的问题
问题是从十进制表示转换为二进制表示的精度损失。相反,请使用十进制浮点数表示形式:
住在科里鲁
#include <boost/lexical_cast.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <string>
#include <iostream>
using Double = boost::multiprecision::cpp_dec_float_50;
int main() {
Double x("0.009"),
y = x*2,
z = x/77;
for (Double v : { x, y, z }) {
std::cout << boost::lexical_cast<std::string>(v) << "n";
std::cout << v << "n";
}
}
指纹
0.009
0.009
0.018
0.018
0.000116883
0.000116883
boost::lexical_cast
不允许在将浮点数转换为其字符串表示形式时指定精度。从文档
对于更复杂的转换,例如精度或格式需要比默认行为
lexical_cast
提供的更严格的控制,建议使用传统的std::stringstream
方法。
所以你可以使用stringstream
double d = 0.0009;
std::ostringstream ss;
ss << std::setprecision(4) << d;
std::cout << ss.str() << 'n';
或者另一种选择是使用boost::format
库。
std::string s = (boost::format("%1$.4f") % d).str();
std::cout << s << 'n';
两者都将打印0.0009
.
0.0009
是一个双精度浮动文本,假设IEEE754,值
0.00089999999999999997536692664112933925935067236423492431640625
这就是boost::lexical_cast<std::string>
看到的函数参数。cout
格式化程序中的默认精度设置四舍五入到第 17 个有效数字:
0.00089999999999999998
真的,如果你想要精确的十进制精度,那么使用十进制类型(Boost 有一个(,或者自己在整数和拼接小数分隔符中。但在您的情况下,鉴于您只是输出数字而没有复杂的计算,四舍五入到第 15 个有效数字将产生预期的效果:注入
std::setprecision(15)
到输出流中。
相关文章:
- 尝试将字符串/字符转换为整数会产生意外结果
- 使用 sprintf 和 %g 将双精度转换为字符串的意外结果
- 当我用"ñ"字符循环访问字符串时出现奇怪的结果
- 将字符串强制转换为GUID并不能得到正确的结果
- C++:比较运算符>和字符串文本的意外结果
- 字符串 erase() 函数为类似的调用给出不同的结果
- 提升精神:将结果复制到字符串向量中
- 硬编码字符串与强制转换为 PUCHAR 并打印到控制台时从控制台读取的字符串的结果不同
- 对于字符串中的每个字符都会给出错误的结果
- C++ 字符串的排列,输出的结果小于或等于字符串的长度
- 尝试以随机字符(长读取)打印字符串返回结果
- 访问字符串::c_str()的结果时出现瓦尔格林德内存访问错误
- *char数组到字符串(两次运行代码和两个不同的结果)
- 在尝试提交作业警告时,我一直在警告:与未指定行为的字符串字面结果比较[-WADDRESS]
- 如何使用字符串和整数获取汽车类的整数结果
- 将词法强制转换双倍提升为字符串,给出无效结果
- std::字符串流,直接输出缓冲区/字符串结果访问,避免复制
- 在代码注释中接受字符串结果
- 字符* 到字符串 c++(结果不是预期的)
- 奇怪的字符串结果