c\c++ 中存储 COM 的 VT_DECIMAL 的正确类型是什么?

2023-12-20

我正在尝试为 ADO 编写一个包装器。

A DECIMAL是一种类型 aCOM VARIANT可以是,当VARIANT类型是VT_DECIMAL.

我试图将其放入 C 原生数据类型中,并保留变量值。 似乎正确的类型是 long double,但我收到“没有合适的转换错误”。

例如:

_variant_t v;
...

if(v.vt == VT_DECIMAL)
{
  double d = (double)v; //this works but I'm afraid can be loss of data...
  long double ld1 = (long double)v; //error: more then one conversion from variant to long double applied.
  long double ld2 = (long double)v.decVal; //error: no suitable conversion function from decimal to long double exist.  
}

所以我的问题是:

  1. 使用 double 存储所有可能的十进制值是否完全安全?

  2. 如果不是,我怎样才能将小数转换为长双精度?

  3. 如何将小数转换为字符串? (使用 sprintf对我也有好处)


内部表示为DECIMAL不是双精度浮点值,它是带有符号/比例选项的整数。如果你要初始化DECIMAL部分,您应该初始化这些字段 - 96 位整数值、小数位数、符号,然后您将获得有效的小数VARIANT value.

DECIMAL on MSDN https://web.archive.org/web/20170621131455/http://msdn.microsoft.com:80/en-us/library/windows/desktop/ms221061(v=VS.85).aspx:

  • 比例 - 数字的小数位数。有效值从 0 到 28。因此 12.345 表示为 12345,小数位数为 3。
  • 标志——表示标志; 0 表示正数,DECIMAL_NEG 表示负数。因此,-1 表示为设置了 DECIMAL_NEG 位的 1。
  • Hi32 - 数字的高 32 位。
  • Lo64 - 数字的低 64 位。这是一个 _int64。

你的问题:

使用 double 存储所有可能的十进制值是否完全安全?

您不能直接初始化为 double (例如VT_R8),但您可以初始化为双变体并使用变体转换 API 转换为VT_DECIMAL。可以对值进行小舍入。

如果不是,我怎样才能将小数转换为长双精度?

如何将小数转换为字符串? (使用

VariantChangeType https://msdn.microsoft.com/en-us/library/windows/desktop/ms221258可以将十进制变体转换为另一种类型的变体,包括整数、双精度、字符串 - 您提供要转换为的类型。反之亦然,您也可以将不同的东西转换为十进制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c\c++ 中存储 COM 的 VT_DECIMAL 的正确类型是什么? 的相关文章

随机推荐

  • 如何将 io.Reader 转换为 io.ReadCloser? [复制]

    这个问题在这里已经有答案了 我有一个io Reader不需要关闭 stringReader strings NewReader shiny 我想将它传递给接收的方法io ReadCloser func readAndClose source
  • CPU 未充分利用。由于阻塞 I/O?

    我试图找到未充分利用 CPU 的 C 服务器应用程序的瓶颈所在 我认为这可能是由于磁盘 I O 性能不佳造成的 与应用程序本身无关 但我很难从这个假设中得出事实 应用程序从本地 MSMQ 队列读取消息 对每条消息进行一些处理 并在处理消息后
  • 移除嵌入对象时 pullAll

    我有包含以下文档的数据库 gt db bios find name first James pretty id 9 name first James last Gosling birth ISODate 1955 05 19T04 00 0
  • 从 java 运行命令提示符?

    嗨 我想使用 java 从命令提示符运行一些东西 我想进入以下目录C Program Files OpenOffice org 3 program 然后运行soffice headless accept socket host 127 0
  • 如何在 mongodb 中与聚合更新一起设置和取消设置?

    db getCollection name update bid 3860 set tl add multiply intField 24 60 60 1000 dateField unset intField 1
  • 我的 Web 服务器的版本控制

    我正在构建一个基于 Web2Py 的 Web 应用程序 并在远程 EC2 开发服务器上进行大部分开发 我想对整个系统进行版本控制 包括所有 python 模块 网页和 Apache 配置文件 这些文件显然分散在我的 Linux 机器上 但我
  • 如何判断一个变量是分配在栈还是堆中?

    在某处偶然发现这个面试问题 在C中 给定一个变量x 如何确定该变量的空间是在堆栈还是堆上分配的 有什么方法可以以编程方式找到它 而不必通过符号表等 并且查找空间是否在堆栈或堆中分配有任何实际意义吗 不 一般来说不是 你知道gcc吗 fspl
  • 如何在Pygame中画一个半透明的圆圈?

    我正在尝试在 Pygame 中画一个半透明的圆圈 这是我的代码 import pygame pygame init clock pygame time Clock screen pygame display set mode width h
  • Solr DataImportHandler:我可以使用 XPathEntityProcessor 从 xml 属性获取动态字段名称吗?

    我有一些 XML 要摄取到 Solr 中 这听起来像是一个旨在由 DataImportHandler 解决的用例 我想要做的是从一个 XML 属性中提取列名 并从另一属性中提取值 这是我的意思的一个例子
  • 跨流程使用事务

    我正在尝试使用 System Transactions TransactionScope 来协调一组进程 每个进程都执行一些数据库工作 最终 所有进程都需要通过一个父进程以原子方式提交或回滚 不幸的是 到目前为止我所尝试的一切都不起作用 我
  • Maven GWT 2.0 和 Eclipse

    有谁知道使用 maven 和 eclipse 使用新的 2 0 版本的 GWT 创建项目的好指南吗 我在让他们很好地合作方面遇到了很多问题 对于它的价值 我可以使用 Maven Eclipse 插件创建一个 gwt 项目 该项目工作正常 但
  • iOS - 更改 UIBarButtonItem 高度

    UIToolbar 有一个很好的调整大小选项 self navigationController toolbar frame 我想知道是否有人知道更改 UIBarButtonItem 高度的方法 我有一个高度为 117 像素的自定义工具栏
  • Rails where() 数组上的 SQL 查询

    我会尽可能地解释这一点 我对用户帖子有疑问 selected posts Posts where category gt Baseball 我想写下以下声明 这是伪术语 User where user has a post in selec
  • 自定义对话框中的 java.lang.IllegalStateException

    我是 Android 新手 正在开发自定义警报对话框 我想通过单击编辑按钮打开另一个对话框 代码如下 if v getId R id edt order System out println edit buton click System
  • 如何配置 charles-proxy 在 Linux 中与 chrome 一起使用 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我尝试设置 chrome 代理 google chrome proxy server 127 0 0 1 8888 Chrome 打开一个
  • 是否有处理 IO 的组长协议规范?

    在Erlang中 每个进程都有一个组长 当一个进程想要打印一些东西 即它调用io库或做类似的事情 时 它会向其组长发送一条消息 我的问题是 在哪里可以找到这些消息的规范 或者一般来说 明确小组领导者应该做什么 我通过一些实验设法发现 有时该
  • Angular 2 选择器中的 kebab-case (tslint)

    这是我的tslint json file rulesDirectory node modules codelyzer rules class name true comment format true check space curly t
  • 浮动操作按钮不会引发 OnClick 事件

    我有以下布局
  • 通过 Azure API 管理将 REST API 公开为 SOAP

    我们有一组现有的 REST API NET Core 我们需要将这些 API 公开为 SOAP 服务 希望通过使用 Azure API 管理来实现 这可能吗 我看过很多关于将 SOAP 服务公开为 REST API 的帖子 但没有看到相反的
  • c\c++ 中存储 COM 的 VT_DECIMAL 的正确类型是什么?

    我正在尝试为 ADO 编写一个包装器 A DECIMAL是一种类型 aCOM VARIANT可以是 当VARIANT类型是VT DECIMAL 我试图将其放入 C 原生数据类型中 并保留变量值 似乎正确的类型是 long double 但我