社区
数据库
帖子详情
variant_t转换 double 问题.
gaosonglove
2009-09-18 04:04:14
用VC 以ADO方式从SQL中提取jwv1字段值,字段类型为numeric,现在问题是提取的值保留在variant_t变量类型中,variant_t转换为DOUBLE类型该怎么转换?我尝试了一种方法
m_v1.ChangeType(VT_R8,NULL);
jwv1=V_R8(&m_v1);
出错,提示精度无效。
请教高手,谢谢.
...全文
1754
12
打赏
收藏
variant_t转换 double 问题.
用VC 以ADO方式从SQL中提取jwv1字段值,字段类型为numeric,现在问题是提取的值保留在variant_t变量类型中,variant_t转换为DOUBLE类型该怎么转换?我尝试了一种方法 m_v1.ChangeType(VT_R8,NULL); jwv1=V_R8(&m_v1); 出错,提示精度无效。 请教高手,谢谢.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hagrid
2011-04-12
打赏
举报
回复
需要解答
尘雨
2009-09-19
打赏
举报
回复
数据库里定义了,只保留两位小数的精度,所以是没有问题的。
由于float在内存中占4个字节(32 bit),对于这个数来说会有数据丢失。实型数据是按照指数形式存储的。系统把一个实型数据分成小数部分和整数部分分别存放。对于我们的三十二系统来说,小数部分大概占据24bit,包含一个符号位。
在转换到float的运算的时候,由于移位运算,会出现尾巴带1的问题,这涉及到float的具体存储方式和运算方式,有些资料你可以参考。
这里,如果想要得到100%完全相互等价的float和adNumeric,几乎是不可能的。所以通常如果要涉及比较float和numeric的地方,我们最好用字符串存储numeric数据,保留两位的小数,这样基本不会出现问题。也许比较字符串的开销,会被认为比较大,但实际上,对float的密集转换运算也并不小。
gaosonglove
2009-09-18
打赏
举报
回复
[Quote=引用 7 楼 vieri_ch 的回复:]
pprameter3->Name="@jwv1";
pprameter3->Type=adNumeric;
pprameter3->Size=19;
pprameter3->Precision = 8L; // 精度 numeric类型必须指定
pprameter3->NumericScale =3L; // 小数位 numeric类型必须指定
pprameter3->Direction=adParamOutput;
m_pCommand->Parameters->Append(pprameter3);
[/Quote]
不过新问题来了,
读取SQL数据库数据为33.06,实际上在float类型变量jwv1存放的却是33.06001 读取其他的数比如30.98,5.92在jwv1存放的结果还正确,小数点后面补充了几个0,即 30.980000,5.920000,为什么是这样呢?
gaosonglove
2009-09-18
打赏
举报
回复
谢谢大家,已解决
尘雨
2009-09-18
打赏
举报
回复
pprameter3->Precision = 18L
尘雨
2009-09-18
打赏
举报
回复
pprameter3->Name="@jwv1";
pprameter3->Type=adNumeric;
pprameter3->Size=19;
pprameter3->Precision = 8L; // 精度 numeric类型必须指定
pprameter3->NumericScale =3L; // 小数位 numeric类型必须指定
pprameter3->Direction=adParamOutput;
m_pCommand->Parameters->Append(pprameter3);
fandh
2009-09-18
打赏
举报
回复
解决就好!呵呵
gaosonglove
2009-09-18
打赏
举报
回复
[Quote=引用 3 楼 gaosonglove 的回复:]
引用 1 楼 fandh 的回复:
double jwv1=atof(_bstr_t(m_v1));
多谢楼上解答。试了下还是那个错误。
@jwv1 在SQL数据类型为nemeric 9(18,3),而在VC 中读取代码为
pprameter3->Name="@jwv1";
pprameter3->Type=adNumeric;
pprameter3->Size=18;
pprameter3->Direction=adParamOutput;
m_pCommand->Parameters->Append(pprameter3);
我测试了下,是这段代码有点问题,可能是SIZE大小不一致吧.
[/Quote]
我补充的问题,刚才解决了。
转换的值却是0.000000
郁闷
gaosonglove
2009-09-18
打赏
举报
回复
只是想不大明白。SIZE大小该怎么设定?
gaosonglove
2009-09-18
打赏
举报
回复
[Quote=引用 1 楼 fandh 的回复:]
double jwv1=atof(_bstr_t(m_v1));
[/Quote]
多谢楼上解答。试了下还是那个错误。
@jwv1 在SQL数据类型为nemeric 9(18,3),而在VC 中读取代码为
pprameter3->Name="@jwv1";
pprameter3->Type=adNumeric;
pprameter3->Size=18;
pprameter3->Direction=adParamOutput;
m_pCommand->Parameters->Append(pprameter3);
我测试了下,是这段代码有点问题,可能是SIZE大小不一致吧.
尘雨
2009-09-18
打赏
举报
回复
if (m_v1.vt == VT_R4 )
float f1 = m_v1.fltVal;
if (m_v1.vt == VT_R8 )
double f2 = m_v1.dblVal;
if (m_v1.vt == VT_DECIMAL )
double f3 = (double)m_v1.decVal;
不过可能double和float会引起一些精度问题,你最好通过字符串来格式化你所需的数据
fandh
2009-09-18
打赏
举报
回复
double jwv1=atof(_bstr_t(m_v1));
VC中各种不同数据类型的相互
转换
2(补充)
对VC中的各种不同数据类型进行
转换
(涉及数据类型:int,long,float,
double
,char username[],char temp[200], char *buf,CString,_
variant
_t,_bstr_t)
DELPHI
Variant
变量的使用技巧
delphi 为了完全支持OLE,32位Delphi 增加了
Variant
数据类型,本节将从宏观角度来分析这种数据类型。实际上,
Variant
类型对Pascal语言有普遍而深入的影响,Delphi 控件库中与OLE 无关的地方也使用到这种类型。
Variant
变量没有类型 一般说来,你可以用
Variant
变量存储任何数据类型,对它执行各种操作和类型
转换
。需要注意的是:这违反了Pascal 语言的一贯原则,有悖于良好的编程习惯。
variant
变量的类型检查和计算在运行期间才进行,编译器不会提示代码中的潜在错误,这些错误在进一步测试中才能发现。总之,你可以认为包含
variant
变量的代码是解释性代码,正如解释性代码一样,许多操作直到执行时才能知道,这对代码运行速度会有很大的影响。 上面对
Variant
类型的使用提出了警告,现在来看看
Variant
类型究竟能干什么。基本上说,如果声明了一个
variant
变量: var V:
Variant
; 你就可以把各种不同类型的值赋给它: V := 10; V := 'Hello, World'; V := 45.55; 一旦得到一个
variant
值,你可以把它拷贝给任何兼容或不兼容的数据类型。如果你把值赋给不兼容的数据类型,Delphi 会力尽所能进行
转换
,无法
转换
则颁布一个运行时间错误。实际上,
variant
变量中不仅包含了数据还包含有类型信息,并允许一系列运行时间操作,这些操作很方便,但运行速度慢且安全性差。 见例VariTest,它是上面代码的扩展。窗体上有三个编辑框,一对按钮,第一个按钮的OnClick 事件代码如下: procedure TForm1.Button1Click(Sender: TObject); var V:
Variant
; begin V := 10; Edit1.Text := V; V := 'Hello, World'; Edit2.Text := V; V := 45.55; Edit3.Text := V; end; 很有趣是不是?你可以把一个值为字符串的
variant
变量赋给编辑框Text 属性,还可以把值为整数或浮点数的
variant
变量赋给Text属性。正如你在图10.1中所看到的,一切正常。 (图10.1)按Assign按钮后,例VariTest的输出结果 图 10.1: 例 VariTest 的 Assign 按钮 Click 事件输出结果 更糟糕的是:你还可以用
variant
变量计算数值,从第二个按钮的Click事件代码就可看到这一点: procedure TForm1.Button2Click(Sender: TObject); var V:
Variant
; N: Integer; begin V := Edit1.Text; N := Integer(V) * 2; V := N; Edit1.Text := V; end; 至少这种代码带有一定危险性,如果第一个编辑框包含了一个数字,那么一切运行正常;如果不是,将会引发异常。这里再重申一遍,如果不到万不得以,不要随便使用
Variant
类型,还是应坚持使用传统的Pascal 数据类型和类型检查方法。在Delphi 和 VCL中,
variant
变量主要是用于 OLE 支持和数据库域的访问。
Variant
类型内部结构 Delphi中定义了一个
variant
记录类型,TVarData,它与
Variant
类型有相同的内存布局。你可以通过TVarData访问
variant
变量的实际类型。TVarData 结构中包含了
Variant
类型信息(由Vtype域表示)、一些保留域及当前值。 VType域的取值包括OLE 自动化中的所有数据类型,这些类型通常叫OLE 类型或
variant
类型。以下是
variant
类型的完整列表,按字母顺序排列: varArray varBoolean varByRef varCurrency varDate varDispatch var
Double
varEmpty varError varInteger varNull varOleStr varSingle varSmallint varString varTypeMask varUnknown var
Variant
你可以在Delphi 帮助系统的
variant
s 主题下找到这些类型的说明。 还有许多操作
variant
变量的函数,你可以用它们进行特定的类型
转换
,或通过它们获取
variant
变量的类型信息(例如VarType 函数),当你用
variant
变量写表达式时,Delphi会自动调用这些类型
转换
和赋值函数。另外还有操作
variant
数组的例程,你可以通过帮助文件的
Variant
support routines 主题了解相关内容。
Variant
类型运行很慢!
Variant
类型代码运行很慢,不仅数据类型
转换
如此,两个值为整数的
Variant
变量相加也是如此。它们几乎跟Visual Basic这种解释性代码一样慢!为了比较
Variant
变量和整型变量的运行速度,请看例VSpeed 。 程序中设置了一个循环,记录运行时间并在进程条中显示运行状态。下面是基于
variant
类型的一段代码,基于整型的代码与此相似: procedure TForm1.Button1Click(Sender: TObject); var time1, time2: TDateTime; n1, n2:
Variant
; begin time1 := Now; n1 := 0; n2 := 0; ProgressBar1.Position := 0; while n1 < 5000000 do begin n2 := n2 + n1; Inc (n1); if (n1 mod 50000) = 0 then begin ProgressBar1.Position := n1 div 50000; Application.ProcessMessages; end; end; // we must use the result Total := n2; time2 := Now; Label1.Caption := FormatDateTime ( 'n:ss', Time2-Time1) + ' seconds'; end; 记时这段代码值得一看,因为你可以把它用到任何类型的性能测试中。正如你所看到的,程序用Now 函数获取当前的时间,用FormatDateTime 函数格式化时间差,输出结果以分("n")和秒("ss")表示。除此之外,你可以用Windows API的GetTickCount 函数,该函数能精确显示操作系统启动后至当前的毫秒数。 从上例可见两者的速度差异非常之大,以至于不用精确记时也能看到这种差异。图10.2是在本人计算机上运行程序看到的结果。当然运行结果取决于运行程序的计算机,但是两者的数值比不会有太大变化。
Visual C++ 常用数据类型
转换
方法详解第1/2页
说明:本文纯粹是总结一下有关类型
转换
的贴子, 本人并未对所有方法都做测试,仅仅是为了给大家一个参考。 读者层次:初学 int i = 100; long l = 2001; float f=300.2;
double
d=12345.119; char username[]=”程佩君”; char temp[200]; char *buf; CString str; _
variant
_t v1; _bstr_t v2; 一、其它数据类型
转换
为字符串 短整型(int) itoa(i,temp,10);///将i
转换
为字符串放入temp中,最后一个数字表示十进制 itoa(i,temp,2); /
_
variant
_t与相关类型之间的
转换
转自:http://iamzxf.blog.sohu.com/157600930.html (1)与字符串CString: _
variant
_t temp; CString str_wtdw; str_wtdw=temp.bstrVal; (2)与整数int: _
variant
_t temp; int value; value=temp.iVal; //有时
_
variant
_t的使用
我们先看看COM所支持的一些类型的基本类: (微软提供,在comdef.h中定义) 在COM中使用的标准类Class如下所示: _bstr_t:对BSTR类型进行打包,并提供有用的操作和方法; _com_error:定义抛出的error对象; _com_ptr_t:封装COM接口指针 _
variant
_t:对
VARIANT
类型进行打包,并提供有用的操作和方法; 一、_var...
数据库
4,011
社区成员
39,816
社区内容
发帖
与我相关
我的任务
数据库
VC/MFC 数据库
复制链接
扫一扫
分享
社区描述
VC/MFC 数据库
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章