var
TmpScript: String;
Result: Double;
begin
1: TmpScript := 'begin' + #13#10 +
'result := 600+0+0+0+0+0+0+0-0+0+0+0+0+0-600-0' + #13#10 +
'end;';2: TmpScript := 'begin' + #13#10 +
'result := 482.14+0+0+0+0+0+800+0-0+0+0+0+0+0-482.14-800' + #13#10 +
'end;'; Result := Double(RunScript(TmpScript)); //RunScript()返回类型为Variant。
end;
脚本计算结果同样都是0为什么第一个返回:0;而第二个返回: -1.13686837721616E-13;
我靠,都快疯了。这是delphi6的毛病吗?有高手能解决吗?不胜感激。
TmpScript: String;
Result: Double;
begin
1: TmpScript := 'begin' + #13#10 +
'result := 600+0+0+0+0+0+0+0-0+0+0+0+0+0-600-0' + #13#10 +
'end;';2: TmpScript := 'begin' + #13#10 +
'result := 482.14+0+0+0+0+0+800+0-0+0+0+0+0+0-482.14-800' + #13#10 +
'end;'; Result := Double(RunScript(TmpScript)); //RunScript()返回类型为Variant。
end;
脚本计算结果同样都是0为什么第一个返回:0;而第二个返回: -1.13686837721616E-13;
我靠,都快疯了。这是delphi6的毛病吗?有高手能解决吗?不胜感激。
解决方案 »
- 求rich实现类似SQL查询分析器的功能
- 如何将一TWincontrol控件像TForm一样show出来?而不需要指定它的parent
- 各位有用过Turbo delphi的吗,进来聊聊
- 请贡献你的一份力量:自已编写的控件,在KeyDown事件中怎么监听不到上、下、左、右这四个按钮的事件。
- 请高手帮忙,delphi 读取word 文档
- 求救,关于dbgrideh!
- fastreport如何设置?
- treeview的用法问题??急用!!!一定给分的!!!
- 请教各位打下,我的delphi程序为什么狂吃内存,我已经加了free/destroy!!!!!!
- 各位老兄,能不能把你知道的关于DELPHI的好的个人站点都帖出来,互相交流一下!!
- 用fastreport4怎么链接多个表
- 关于调用的问题
浮点数不是一个有精度等级的数据类型,分为整部份与小数部份,实际上,对于浮点数的运算,对其结果,你只能有一个精度等级.
对于第一个SQL脚本,是一个整数运算,返回的当然是0
对于第二个SQL脚本,是浮点运算在内,返回的数据是有精度等级的,事实上,返回的数据是:-1.13686837721616E-13
也就是: -0.000000000000011268683372...也就是说返回一个很高精度的很小的浮点数.
如果要判断浮点数是否为0.你不能直接用浮点数来与0比较.而是要与一个精度等级进行比较.这些东西,是书本上反复上讲的了.if abs(-1.13686837721616E-13)<=0.0000000001 then
showmessage('result is zero')
482.14+0+0+0+0+0+800+0-0+0+0+0+0+0-482.14-800
这个也就是482.14+800+482.14-800
这个看起来要等于0
但是在计算机中表示的浮点数分为两部分
一部分表示有效位,以部分表示数量级一般是2,4,8,16,的n次平方
为了研究方便假设这个浮点数是8位的
我定义这个8位的
第一位表示符号,如果是1表示负数,0表示整数
接下来3位表示有效位,表示有效数据
接下来1位表示数量级的符号
最后三位表示数量级底数为2
那么我的这个结构最表示最大的数是
(01110111)f = (111)B = 7
表示的最小的数是
(11110111)f = -(111)B = -7
表示最小正数是
(00011111)f = (0.000001)B = 0.0078125如果要是进行你上面的运算
那么比如是
1.75 + 3 - 3 - 1.75
那么我们看看电脑是如何表示的
(1.75)d = (01110001)f
(3)d = (01100011)f
1.75和3相加的时候不是像我们看到的二进制一样相加
他们首先要弄成是数量级相同,然后相加,然后整合数据1.75可以表示成0.111 * 11^1
3 表示成 0.11 * 11^11
那么然三变一下成为
1.1 * 11^1
那么就和1.75表示相同了
然后相加变成
10.011 * 11^1
最后整合成
0.100 * ^11^111
也就是(01010111)f
然后减去3变成
(01000001)f
然后在减去1.75
就变成(11100000)f = - 0.75
这个大致计算机中表示浮点数就是这么表示的
计算机是用二进制表示浮点数的,表示能力有限,所以会造成上面的的结果
if (result)<0.000000001 then 记过为零