Office中国论坛/Access中国论坛
标题: 既要四舍六入又要保留有效数字位数怎样设置 [打印本页]
作者: wang1950317 时间: 2004-10-11 01:14
标题: 既要四舍六入又要保留有效数字位数怎样设置
各位大侠:因工作需要数据要求保留3位(或2位、4位)有效数字,且必须按4舍6入准则处理,如1.254 0.2515 1.225 1.22501 12300 保留3位有效数字且4舍6入分别为: 1.25 0.252 1.22 1.23 1.23E+04(或1.23× 10的四次方) 该用何函数,请各位高手帮忙啦! 谢谢!
作者: xulanghui 时间: 2004-10-11 19:25
=IF(IF(IF(MIDB(A1,2,1)=".","小数","整数")="整数","整数",IF(MIDB(A1,2,1)=".","小数","整数")&INT(A1))="小数0",ROUND(A1,3),ROUND(A1,2))
上面只能四舍五入且保留3位有效数字,对于整数的科学记数,不知道该如何设定条件格式。
您的1.225-----1.22, 1.22501-----1.23 如果保留3位有效数字和5舍6入,是不是有些问题啊?
[此贴子已经被作者于2004-10-11 11:35:51编辑过]
作者: wang1950317 时间: 2004-10-12 19:11
谢谢xulanghui大师的指点. 您的公式我试过了,非常好,基本可以使用.有几点尚不能达到要求. 1如果小数点前有两位数字就不好用了如12.234显示的还是12.23, 156.235显示的是156.23,好在我的数据很少超过个位数的. 2 没有显示出四舍六入的规则来.四舍六入逢到五是这样处理的: 5后面有数字的进位:如1.250001保留1位小数为1.3 如果5后面没有数据则要看5前面的数是双还是单 是单数则进位,是双数则舍去如:1.2500保留一位小数则为1.2 1.350 则为1.4 有效数字是另一个概念, 1.2500 1.350 12.350 保留3位有效数字:1.25 1.35 12.4(带四舍六入) 保留两位有效数字则成了1.2 1.4 12 如是大数 则要以指数方式:如12000保留两位有效数字则为:1.2E+4 保留3位有效数字则为:1.20E+3. 请大师按照这个规则再给设置一个公式,再次谢谢 !
作者: xulanghui 时间: 2004-10-13 00:46
您的要求确实比较复杂,很有挑战性。希望黄寅秋大师也看看,要求复杂但也符合逻辑。我估计 黄寅秋大师 有更妙的方法。
作者: wang1950317 时间: 2004-10-13 01:36
更正:3楼贴子中最后两个数据(12000保留两位及三位有效数字)应为:1.2E+04 1.20E+04 现予纠正,只是在数据较大时又要求保留有效数字位数才使用科学记数法。有效数字和四舍六入,是我们日常工作中数据处理的规范要求,以前都是算好了人工再处理一下,现在想在excel(及Accessvs )中自动处理,所以请各位大师费心。
作者: wewyhy 时间: 2004-10-14 05:49
数据范围应该有限吧?先判断大小再分别处理呢
作者: wang1950317 时间: 2004-10-14 18:55
wewyhy大师 :数据范围有一个较宽的范围,根据工作遇到的,较小的数字可至小数后4 、5位,如0.02343 保留3位有效数字为0.0234 大数多在个位 十位 12.250 保留3位有效数字:12.2 如何分别处理,请指教!谢谢!
作者: wewyhy 时间: 2004-10-15 04:56
以下是引用wang1950317在2004-10-12 11:10:49的发言:
谢谢xulanghui大师的指点. 您的公式我试过了,非常好,基本可以使用.有几点尚不能达到要求. 1如果小数点前有两位数字就不好用了如12.234显示的还是12.23, 156.235显示的是156.23,好在我的数据很少超过个位数的. 2 没有显示出四舍六入的规则来.四舍六入逢到五是这样处理的: 5后面有数字的进位:如1.250001保留1位小数为1.3 如果5后面没有数据则要看5前面的数是双还是单 是单数则进位,是双数则舍去如:1.2500保留一位小数则为1.2 1.350 则为1.4 有效数字是另一个概念, 1.2500 1.350 12.350 保留3位有效数字:1.25 1.35 12.4(带四舍六入) 保留两位有效数字则成了1.2 1.4 12 如是大数 则要以指数方式:如12000保留两位有效数字则为:1.2E+4 保留3位有效数字则为:1.20E+3. 请大师按照这个规则再给设置一个公式,再次谢谢 !
比如
在程序里
大于等于10,又小于100的数字,先除以10,再用xulanghui的公式,然后乘以10;
大于等于100,又小于1000的数字,先除以100,再用xulanghui的公式,然后乘以100;
...........................................................
作者: wang1950317 时间: 2004-10-15 22:38
wewyhy 大师:您好,您说的有一定道理。但要把这些处理程序都柔和到xulanghui大侠地公式里成为一个公式 该如何做?请您帮忙!
作者: zipgirl 时间: 2004-10-20 00:11
这是一个很有趣的问题我写了一个东东,好像不很简单(有些函数可能我不太熟悉原原),不过可以达到效果Public Function tst(x, n As Integer)
Dim lns As Integer
Dim clns As Integer
Dim y, m
Dim aug As Integer
aug = 0
x = Val(x)
tst = IIf(x > 0, "+", "-")this:y = Abs(x)
lns = Len(Trim(Str(Int(y)))) - 1If y >= 1 Then
y = y / (10 ^ lns)
y = Int(y * (10 ^ (n - 1)) + 0.5) / (10 ^ (n - 1))
clns = Len(Trim(Str(y))) - 1 Select Case aug
Case 0
If lns > 0 Then
If clns >= n Then
tst = tst & Trim(Str(y)) & "E+" & Trim(Str(lns))
Else
tst = tst & Trim(Str(y)) & String(n - clns, "0") & "E+" & Trim(Str(lns))
End If
Else
If clns >= n Then
tst = tst & Trim(Str(y)) & "E+" & Trim(Str(lns))
Else
tst = tst & Trim(Str(y)) & "." & String(n - clns, "0") & "E+" & Trim(Str(lns))
End If
End If
Exit Function
Case 1
If lns > 0 Then
If clns >= n Then
tst = tst & Trim(Str(y)) & "E-" & Trim(Str(m))
Else
tst = tst & Trim(Str(y)) & String(n - clns, "0") & "E-" & Trim(Str(m))
End If
Else
If clns >= n Then
tst = tst & Trim(Str(y)) & "E-" & Trim(Str(m))
Else
tst = tst & Trim(Str(y)) & "." & String(n - clns, "0") & "E-" & Trim(Str(m))
End If
End If
Exit Function
End Select
ElseIf y > 0 Then
lns = Len(Trim(Str(y)))
For m = 1 To lns
y = y * 10
If y >= 1 Then
x = y
aug = 1
Exit For
End If
Next m
GoTo this
Else
tst = 0
End IfEnd Function
见笑了
作者: zipgirl 时间: 2004-10-20 00:14
说明:其中X为实数,N为你所想取的有效数字位数如:TST(123.345,4)表示123.456取四位有效数字
作者: zipgirl 时间: 2004-10-20 00:18
真是见鬼了,进了EXCEL,呵呵
作者: wang1950317 时间: 2004-10-20 00:49
谢谢zipgirl的热心指点,不过我时菜鸟,对编程不懂,不过我可以照葫芦画瓢先在Access中克隆一下,如有问题,在向您请教。谢谢! 看来office-cn 高手如云哪!
作者: zipgirl 时间: 2004-10-20 19:35
晚上想了一下,写了个虽然还是繁琐但条理比较清楚的函数,我试了一下,我试过的数据暂未出现错误,不过那个数要为字符型(string,可看后面例子),即使你输入的数字是中文也可以实现本效果,望能给你帮上忙。function tst(num as string,n as integer) as stringdim x,y,z,numlngdim expnum as stringdim i as longdim m() as byteif n<1 thenmsgbox "啥也不留,计算结果给空气啊?",vbokonly,"别耍我了,GM!"exit functionend ifx=val(num)tst=iif(x>=0,"+","-")y=abs(x)if x=0 then tst=0exit functionend ifif y>=1 thenm=strconv(z,vbfromunicode)for i=1 to ubound(m)if m(i)=46 thenexit forend ifnextexpnum=iif(i>1,"E+" & trim(str(i-1)),"")z=y/(10^(i-1))elsem=strconv("0" & z,vbfromunicode)for i=0 to uboun(m)if m(i)>=49 thenexpnum="E-" & trim(str(i-1))z=y*10^(i-1)exit forend ifnextend ifnumlng=len(trim(str(z)))-1if numlng=1 thentst=tst & trim(str(z)) & iif(n>1,".","") & string(n-1,"0")exit functionend ifz=int((z*(10^(n-1))+0.5))/10^(n-1)if n<=numlng thentst=tst & trim(str(z)) & expnumexit functionelsetst=tst & trim(str(z)) & string(n-numlng,"0" & expnumend ifend function'tst("-0.0002",4)的结果为2.000E-4,数字最好加上引号'tst("-123.456789。中国",5)的结果为-123.46E+2'如果对0的结果要求为0.000之类,可删除‘if x=0 then ’tst=0‘exit function
作者: zipgirl 时间: 2004-10-20 19:40
对不起,没看到四舍六入(这东东用来干啥?我没见过耶),哈哈,你可修改一下,很简单的[em07]
作者: shisgs 时间: 2004-10-22 04:38
round不行吗?
作者: 异乡客 时间: 2004-10-27 00:02
round就是四舍六入的,不过的先判断一下范围,
作者: wang1950317 时间: 2004-10-28 01:02
zipgirl老师:谢谢您的帖子。我对编程是菜鸟,将您的东东拿来捣鼓了半天,不知从何处下手。烦您指点一下我怎样在Excel中使用您的程序?此程序在Access中是否也可用?谢谢您的热心!
作者: wang1950317 时间: 2004-10-28 01:14
这个东西是从事物理或化学检测的工作人员日常对检测结果进行数据处理天天要打交道的。也是国家标准检验方法中所要求,一般国家标准检验方法最后都有这样的字样:测定结果保留3位有效数字(多数保留3位,也有要求保留2位等,数据需按有效数字位数进行四舍六入)。原先使用计算器或电脑计算后再人工按这个要求处理。现在我是想在Excel或Access中设计成公式或模块,进行自动计算。请各位大师帮忙!不胜感谢!!
作者: wang1950317 时间: 2004-10-28 01:20
Round在Excel中仍然是四舍五入。
作者: apolloh 时间: 2004-11-7 23:30
http://club.excelhome.net/dispbbs.asp?boardID=3&ID=68996&page=1
[此贴子已经被作者于2004-11-25 9:26:12编辑过]
作者: apolloh 时间: 2004-11-8 02:06
http://club.excelhome.net/dispbbs.asp?boardID=3&ID=68996&page=1
[此贴子已经被作者于2004-11-25 9:26:25编辑过]
作者: wang1950317 时间: 2004-11-13 01:29
谢谢楼上朋友,很厉害!但是在这样的小数不知可不可以,如0.001245 保留3位有效数字应为0.00124.(前面的零不是有效数字,是小数定位用的).
作者: apolloh 时间: 2004-11-20 07:01
请关注最新进展
http://club.excelhome.net/dispbbs.asp?boardID=3&ID=68996&page=1
[此贴子已经被作者于2004-11-25 9:27:04编辑过]
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) |
Powered by Discuz! X3.3 |