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

SHR*_*SHR 4 c++ com ado decimal

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

当类型是A时,A DECIMAL是一种类型.COM VARIANTVARIANTVT_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.  
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

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

  2. 如果没有,我怎样才能将小数转换为long double?

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

Rom*_* R. 5

内部表示DECIMAL不是双精度浮点值,而是整数而不是符号/缩放选项.如果要初始化DECIMAL部件,则应初始化这些字段 - 96位整数值,比例,符号,然后获得有效的十进制VARIANT值.

DECIMAL在MSDN上:

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

你的问题:

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

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

如果没有,我怎样才能将小数转换为long double?

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

VariantChangeType可以将decimal变量转换为另一种类型的变体,包括integer,double,string - 您提供要转换的类型.反之亦然,您也可以将不同的东西转换为十进制.