关于有效数位计算的方法(100分)

  • 主题发起人 主题发起人 快乐猪儿
  • 开始时间 开始时间

快乐猪儿

Unregistered / Unconfirmed
GUEST, unregistred user!
注释1 有效位数即为从左边第一位不是零的位置开始数起,一直到末尾(除了小数点),
该数的长度称为该数的有效位数。例如:1.2256 有效位数是5位,0.0125的有效位
数是3位,12000.00的有效数位是7位;
注释2 如果给定一个数1.38856 要求按四舍五入的方法保留3位有效数字即为:1.39
保留4位有效数字是1.389。
问题:如何利用delphi,计算某数按某特定的有效位数进行近似处理,来实现下面的一个方
法 function TheAvaiValOfNum(avon_num:real;avon_bit:integer):real;
其中avon_num为需要进行处理的实数;avon_bit为保留有效数位数;返回值为
avon_num进行四舍五入保留avon_bit位有效数字的最后结果。
 
用Format怎样?
 
这个只有你自己写了,主要用一些字符串函数而已,不难的。
 
我也想过用字符串函数进行处理,可是具体情况还是比较复杂,比如15000保留3位有效位数时需要进行科学计数方法,所以我希望能够得到大家的帮助,希望找到比较巧妙的方法
 
你这么多要求加在一起就代表不太可能有比较巧妙的方法,因为是无规律的。
 
一个简陋的思路:
pos出“。”号的位置:
1.的到“。”左边的个数
2.得到“。”右边的个数
然后取舍……
 
to 无泪
能详细点么?
 
其实我的只是一个构思:
pos出“。”号的位置:
s1.的到“。”左边的个数
s2.得到“。”右边的个数
如:12345.38856 要得到3个有效位,s1,得到为数为5,s2得到位数为5
如果,s1<3,这样就直接-对小数部分取舍了,我不用多说,
如过,s1>3,这样就要把s1给截断了,取12345中的123*E's1'--其中's1'代表的是,s1里面的长度,-----123*E5
其他的就好解决了吧,也许有我没有想到的,你看看吧
 
从左边开始找不是 “0”和“.”的,开始算,右边的不是“.”的都算一位
 
先确定小数点位数,再用format函数
 
1,判断是否是小于1的小数,是,则继续判断小数点后第一个不为零的位置iPos并跳转到2;否,则判断整数部分iLen并跳转到3
2,Result:=RoundTo(avon_num,-(avon_bit+iPos));
3,Result:=RoundTo(avon_num,iLen-avon_bit);
 
那么,ipos该如何确定?
 
要自己写函数[:D]
 
这个自己写,把所有的情况考虑进去,你可以的到你要的结果,就比如写科学技术法,你要的结果的表现形式是怎么样的。
只要判断,小数点前面的位数与要保存的有效位数的大小。小数点所在的位置
处理好这个就可以了
 
如果给定一个数1.38856 要求按四舍五入的方法保留3位有效数字即为:1.39
保留4位有效数字是1.389。
我的方法是先 * 100, 或 1000 (看保留几位) 四舍五入取整,再 / 100 或1000(看保留几位)
 
0.001,则iPos=2,也许是3,你先试试看,给你一个函数:
function getfirst0(isource:string):integer;
var i,iPos:integer;
begin
result:=0;
iPos:=pos('.',isource);
for i:=iPos+1 to length(isource)do
begin
if isource<>0 then
begin
result:=i-iPos;
break;
end;
end;
end;
 
谢谢你,dey-999
 
后退
顶部