round浮点数精度公式的写法之一

验证有限数据环境,暂时看,也是达到目的了。

可以写为:

=ROUND(1-D5+POWER(10,-(3+2)),3)

也可以

=LET(BIT,F3,ROUND(1-D3+POWER(10,-(BIT+2)),BIT))

这几个数字的验证结果,和下方的大佬的公式得到的结果相同

=ROUND(TEXT(1-0.9975,"0.##############"),3)

有待验证其他数据环境。

进一步研究一下。

幂应该是原小数位数+2以上,更适合

所以可以这样写

=LET(BIT,F2,ROUND(1-D2+POWER(10,-(BIT+9)),BIT)) 可以写成比2多得多的9。

还发现一个比较有意思的事。

🚫当小数点后连续两个0时,浮点数位数就不一样了。即使设置了显示精度为准,也没用。

这也就是为什么BIT+2失效的原因。改为BIT+9,让power生成一个大于一定的位数的小数,运算就正常。很奇怪。

所以也可写为,(看这样,四舍五入这块,就是调整这个9,生成一个超过一定位数的值,参与运算就可以。经过测试,目前公式里 这个值的范围是5-12都可以,不在这个范围,0.14999就出错,5为最小数的原因,就是0.14999小数点后有5位数,power生成的小数位数不能少于这个5。)

=ROUND(1-D5+POWER(10,-(3+9)),3)

roundbank函数涉及奇偶数判断,应该不是简单加或减。不过可以继续研究。

必应搜索的时候。发现社区的这个帖子。回复 里有银行家舍入的公式。

https://forum.wps.cn/topic/37648

2026-04-18 8:22 补充(想表现完整,公式会非常繁琐。不如直接大佬的text方便了

小数最后两位偶数+5,保留位数涉及判断奇偶时,公式写为

=LET(BIT,K8,ROUNDBANK(1-I8-POWER(10,-(BIT+2)),BIT))

否则

=LET(BIT,K8,ROUNDBANK(1-I8+POWER(10,-(BIT+2)),BIT))

在有限的测试数据下,和下面2个公式表现基本一致

=ROUNDBANK(1-I7,K7)

=ROUNDBANK(TEXT(1-I7,"0.################"),K7)

2026-04-18 15:26补充:

=ROUND(TEXT(1-0.91785,"0.################"),F2) => 0.831四舍五入结果也不对

=LET(BIT,F2,ROUND(1-D2+POWER(10,-10),BIT)) 5位以内仍然能获取到正确结果

=LET(BIT,F2,ROUND(1-D2+POWER(10,-18),BIT)) 6位以内仍然能获取到正确结果

验证宏函数:

function test(){
Console.clear()
for(let i=0.99985;i>0;i=i-0.001){
Range("D2").Value2 = i.toFixed(5)
let g2str = Range("G2").Value2.toString().slice(0,6)
let g5str = Range("G5").Value2.toString().slice(0,6)
let g8str = Range("G8").Value2.toString().slice(0,6)
//console.log(g2str)
//console.log(g5str)
//console.log(g8str)
if(g2str === g5str && g5str === g8str){
//console.log("一致"+i.toFixed(4))
}else{
console.log("不一致"+i.toFixed(5))
}
}

}

黑龙江省
浏览 197
1
6
分享
6 +1
8
1 +1
全部评论 8
 
wils
wils Lv.2 潜力创作者

Lv.2潜力创作者

当用于ROUNDBANK(1-0.975,2)时好像不对 应该不能只用加的
· 海南省
回复
wils
wilsLv.2 潜力创作者

Lv.2潜力创作者

对于手写数字ROUND(0.14999,1)好像也不对
· 海南省
回复