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

标签 c++ com decimal ado

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

DECIMALCOM 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. 如果不是,如何将小数转换为 long double?

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

最佳答案

DECIMAL 的内部表示不是 double 浮点值,而是带有符号/比例选项的整数。如果您要初始化 DECIMAL 部分,您应该初始化这些字段 - 96 位整数值、比例、符号,然后您将获得有效的十进制 VARIANT 值。

DECIMAL on MSDN :

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

您的问题:

is it totally safe to use double to store all possible decimal values?

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

if not, how can I convert the decimal to a long double?

How to convert a decimal to string? (using the << operator, sprintf is also good for me)

VariantChangeType可以将十进制变体转换为另一种类型的变体,包括整数、 double 、字符串 - 您提供要转换为的类型。反之亦然,您也可以将不同的值转换为十进制。

关于c++ - c\c++ 中存储 COM 的 VT_DECIMAL 的正确类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33396728/

相关文章:

c++ - 设置 + 第 n 个元素 : fast implementation

C++ - 如何调用递归继承的模板化基类的模板化方法

c++ - 如何移动窗口客户区的起始坐标?

c# - tlbexp.exe 更改方法名称的大小写

c# - 将具有许多前导零的字符串转换为十进制

apache-flex - 数字步进小数的奇怪行为

C++ 对包含引用的对 vector 的奇怪行为

c# - 我如何在 C++ 中使用 ArrayList?

visual-studio - 可以在开发机器上不注册的情况下使用免注册 COM 组件吗?

c# - 从 C# 到 SQL Server 的精度损失