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++ - 不同项目中多个类的基类

c# - 如何连接 COM 事件调度程序?

com - Powershell 远程 : Microsoft. Update.Session,访问被拒绝:0x80070005

javascript - 如何使用以系统用户身份运行的 WScript 访问用户的 iTunes 实例?

javascript - 使用 'ScriptEngine'计算公式而不损失任何精度

c++ - 在 MakeFile 中包含 STXXL 库

c++ - 如何从 Visual Studio 2010 中的 Visual C++ 项目链接到不同版本的 MFC?

c# - 在 .NET 中除两位小数时出现溢出异常

c++ - 如何在std算法中使用unique_ptr的transform_iterator

javascript - 如何在 JavaScript 中进行乘法运算?小数的问题