我正在尝试为 ADO 编写一个包装器。
DECIMAL
是 COM 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.
}
所以我的问题是:
使用 double 存储所有可能的十进制值是否完全安全?
如果不是,如何将小数转换为 long double?
如何将小数转换为字符串? (使用 << 运算符,
sprintf
对我也有好处)
最佳答案
DECIMAL
的内部表示不是 double 浮点值,而是带有符号/比例选项的整数。如果您要初始化 DECIMAL
部分,您应该初始化这些字段 - 96 位整数值、比例、符号,然后您将获得有效的十进制 VARIANT
值。
- 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/