【回复贴】一言难尽的Round(关于Round的运算机制的测试)
一言难尽的Round https://bbs.wps.cn/topic/31968
示例中C3:C10的Round对B3:B10中的末位数5时舍时入,确实很让人迷惑,为验证这个问题作了以下关于Round的测试:
在A列输入数字,B列计算小数位数,C列是用1减A列的结果,这个结果似乎很正常。
然后对C列计算了一下小数位数:
发现了一些不寻常的情况,D5:D8的小数竟然到了17和19位(肯定是浮点运算惹的祸,没办法,谁让现在的计算机是2进制呢,2进制是没办法完全精确的表示小数的,等将来有十进制的计算机也许就不会这样了)。
多提取一位小数看看是什么状况:
原来C5显示的0.0015其实是0.00149......舍入的结果,并非真的是0.0015。
再对末位Round一下:
这回F5得到的是真正的0.0015。
用这个结果再对末位Round一下:
这回达到预期的效果了。
结果就是,想保留3位小数,你得有个精确的4位小数,要得到精确的4位小数,就是对第5位小数Round,于是就变成这样:Round( Round( ... , 4 ) , 3 )
所以对1-0.9985进行保留3位的舍入的精确公式是:
=ROUND(ROUND(1-0.9985,4),3)
内层的Round( ... , 4 )是对第5位小数的 或舍或入
然后对这个得出的有4位小数的结果Round( ... , 3 )就可以了。
测试证明Round函数只对第2参数后面的1位小数进行 舍|入,多余的小数位全部舍弃。
创作者俱乐部成员
创作者俱乐部成员
WPS函数专家