我正在尝试为 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.
}
所以我的问题是:
使用 double 存储所有可能的十进制值是否完全安全?
如果不是,我怎样才能将小数转换为长双精度?
如何将小数转换为字符串? (使用 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(使用前将#替换为@)