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))
}
}
}
Lv.2潜力创作者
Lv.2潜力创作者