第1个回答 2013-08-28
A1 为你要的数据
A2 为你要保留的位数
A3 输入公式 =SIGN(A1)*(IF(AND(MID(TEXT(ABS(A1),"0.00000000000000E+000"),A2+2,15-A2)="5"&REPT("0",14-A2),MOD(MID(TEXT(ABS(A1),"0.00000000000000E+000"),A2+(A2>1),1),2)=0),ROUNDDOWN(LEFT(TEXT(ABS(A1),"0.00000000000000E+000"),16),A2-1),ROUND(LEFT(TEXT(ABS(A1),"0.00000000000000E+000"),16),A2-1))&RIGHT(TEXT(ABS(A1),"0.00000000000000E+000"),5))
罗嗦了点,但整数前都可以取
第2个回答 2013-08-28
create function sslr(@num numeric(20,10),@i int)
--@i保留的小数位
--@num传入的数据
returns varchar(20)
as
begin
declare @numtemp numeric(20,10),@result varchar(20)
set @numtemp=abs(@num)*power(10,@i+1)
select @numtemp=(case when floor(@numtemp)-floor(@numtemp/10)*10=5
then (case when @numtemp-floor(@numtemp)=0
then (case when cast(floor(@numtemp/10) as int)%2=0
then floor(@numtemp/10)/power(10,@i)
else round(@numtemp/power(10,@i+1),@i)
end)
else round(@numtemp/power(10,@i+1),@i)
end)
else round(@numtemp/power(10,@i+1),@i)
end)
set @result=(case when @num>0 then str(@numtemp,20,@i) else str(0-@numtemp,20,@i) end)
return @result
end
第3个回答 2023-04-11
这两个公式都能用,第一个短一点,第二个逻辑好懂一点,随便选一个复制过去就行:
=ROUND(A1,B1)-(ROUNDDOWN(MOD(ABS(A1)*10^(B1+1),20),11)=5)/10^B1*((A1>0)*2-1)
=IF(ROUNDDOWN(MOD(ABS(A1)*10^(B1+1),20),11)=5,ROUNDDOWN(A1,B1),ROUND(A1,B1))
这两个都是excel里把"A1"进行四舍六入保留到"B1"位的函数,针对正负数都通用。
公式里的"B1"可以改成数字使用,想保留几位小数就改成几,保留到十位百位就用"-1""-2"。
注:修约规则参考:GB/T 8170-2008 《数值修约规则与极限数值的表示和判定》。本回答被网友采纳
第4个回答 2018-01-11
如果按修约规则,1.2451修约到两位小数的话应是1.25,但按这个公式修约成了1.24
=IF(MOD(INT(A1*1000),5)=0,IF(MOD(INT(A1*100),2)=0,INT(A1*100)/100,ROUND(A1,2)),ROUND(A1,2))