gpt4 book ai didi

c++ - 将 lexical_cast double boost 为字符串,给出无效结果

转载 作者:太空狗 更新时间:2023-10-29 20:09:10 26 4
gpt4 key购买 nike

我正在尝试这个:

std::cout << boost::lexical_cast<std::string>(0.0009) << std::endl;

并期望输出为:

0.0009

但是输出是:

0.00089999999999999998

g++版本:5.4.0,Boost版本:1.66

我该怎么做才能让它打印出给定的内容。

最佳答案

事实上,您可以覆盖默认精度:

Live On Coliru

#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::) 又不灵活(现在所有 double 都会以这种方式出现)。

真正的问题

问题是从十进制表示形式转换为二进制表示形式时精度下降。相反,使用十进制 float 表示:

Live On Coliru

#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

关于c++ - 将 lexical_cast double boost 为字符串,给出无效结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48595355/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com