如何将 Python Decimal 实例转换为 C++ double?

Posted

技术标签:

【中文标题】如何将 Python Decimal 实例转换为 C++ double?【英文标题】:How do you convert a Python Decimal instance to a C++ double? 【发布时间】:2021-02-19 14:39:48 【问题描述】:

在 Python 本身中,您只需编写 float(f),其中 f 是 Python 十进制。这会产生一个 double 类型(在 Python 中称为 float)。

但我需要在boost::python 中执行此操作。我的代码(删节)是

double toDouble(boost::python::object obj)

    std::string type = boost::python::extract<std::string>(obj.attr("__class__").attr("__name__"));
    std::string module = boost::python::extract<std::string>(obj.attr("__class__").attr("__module__"));
    std::string cls = module + "." + type;

    if (cls == "decimal.Decimal")
        double f = boost::python::extract<double>(obj);
        return f;
    
    
    throw "Oops";

但我得到一个错误

没有注册的转换器能够产生类型的 C++ 右值 来自这个十进制类型的 Python 对象的 double.Decimal

我该怎么做?我无法想象它很复杂。显然我错过了一些东西。

【问题讨论】:

【参考方案1】:

if 块中需要的代码是

static boost::python::object builtins
    = boost::python::import("builtins");
static boost::python::object function 
    = boost::python::extract<boost::python::object>(builtins.attr("float"));
boost::python::object ret = function(obj);
double f = boost::python::extract<double>(ret);

我确实在使用 Python 函数 float(obj)

从表面上看,您已经熟悉boost::python::extract

float 是一个内置 python 函数。见https://docs.python.org/3/library/functions.html。所以第一条语句是导入包含内置函数的模块。第二条语句获取float函数。

第三个调用它,在 Boost 文档“调用 Python 函数和方法”的行中。

您也许可以将它们组合在一起以注册此提取,如果知道 Boost 的精美设计方式,这可能只不过是专门设计一个模板。

【讨论】:

以上是关于如何将 Python Decimal 实例转换为 C++ double?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C# BigInteger 转换为 MySQL DECIMAL(36,18)?

可以在 Python 中简单地将 Decimal('5E+1') 转换为 Decimal('50') 吗?

如何将具有 Decimal 的 spark DataFrame 转换为具有相同精度的 BigDecimal 的 Dataset?

如何将 Python 十进制转换为 SQLite 数字?

如何将 Python 数据结构中的所有小数转换为字符串?

在SQL语句里面如何将字符型转换成数字型?