dtcq 发表于 2021-3-6 20:49:57

四舍六入五留双公式,检测同仁有用

检测数据的结果修约规则为四舍六入五留双,比如一个小数要保留两位小数,第三位以后是5,则小数点后第二位按偶数保留,其他情况则执行四舍五入,对于大于等于1000的数据则用科学计数法。比如:0.365->0.36       0.3651->0.37   0.3649->0.36          1275->1.28E+3      1275.1->1.28E+3   1274.9->1.27E+3
这个规则没有现成的公式可用,我尝试做了一个,经测试基本可用,分享给格友,如果有问题欢迎指正。
需要将前面待修约数值修改后,后面修约结果生效。



神经蛙 发表于 2021-8-23 22:16:33

lovert 发表于 2021-8-23 17:09
我的公式

感谢分享!您的JS自定义函数可以解决大部分问题,但是由于JS中数字都是以64位浮点数存储的,因此仍然避免不了十进制和二进制浮点数转换时的精度损失问题。
以您的自定义函数为例,为了合理规避上述问题,在自定义函数中判断m是否为0.5时,通常会采取如下方式来判断末位是否等于0.5,abs(m-0.5)<e,e为一个极小值(如1E-8),而不是直接使用==。
但是尽管上述方式能够解决大部分问题,对于有效数字较多(如超过8位)的数字的修约,仍然可能存在错误,因为此时的e一方面要尽量小,远小于修约间隔,另一方面又不能大于可能产生的浮点数误差,通常1E-8是合适的,但难免会有例外,尤其是当经过多次运算将浮点数误差放大之后。

您可以参考dtcq老师公开课页面附件中的JS代码,对您的函数进行改进,里面使用了类似上述的逻辑来和0.5进行比较。

本人对于编程仅仅是初级水平,但是对于EXCEL中浮点数误差的问题有过相对深入的研究。不知道如VB.NET或C#等编程语言中内置的ROUND函数是如何实现四舍六入的,是否能够完美解决修约时的浮点数误差问题。

dtcq 发表于 2021-3-6 20:55:44

神经蛙 发表于 2021-8-22 18:40:53

感谢分享!用EXCEL前台公式的确可以解决,但是公式可读性和维护性较差,当需要进一步嵌套其他公式时(比如为了将数值转换为文本,使显示位数与修约位数一致,从而解决末位为0时的显示等问题时),会更为混乱。
尽管可以将其定义为名称以提高可读性,但仍然不便于维护。而且由于二进制和十进制转换时的精度损失,以及EXCEL本身运算精度和存储精度不一致的问题,使得这一问题在某些情况下变的更为复杂,会有极个别数值修约不正确的情况(不知道活字格是否存在与EXCEL类似的问题)。
建议还是由活字格官方内置四舍六入函数或插件。

dtcq 发表于 2021-8-22 18:44:41

这个公式还不完善,现在写了一个JS的函数,还未来得及测试。还真是建议官方写一个。

神经蛙 发表于 2021-8-22 20:42:28

dtcq 发表于 2021-8-22 18:44
这个公式还不完善,现在写了一个JS的函数,还未来得及测试。还真是建议官方写一个。

看到您公开课的附件了,还没来得及学习。我也是检测行业的,刚接触活字格,以后还要向您多多学习,还望不吝赐教!

dtcq 发表于 2021-8-22 21:31:24

神经蛙 发表于 2021-8-22 20:42
看到您公开课的附件了,还没来得及学习。我也是检测行业的,刚接触活字格,以后还要向您多多学习,还望不 ...

我编程是个半调子,活字格是个好东西,大家一起学习,共同进步;P。

lovert 发表于 2021-8-22 23:54:43

dtcq 发表于 2021-8-22 21:31
我编程是个半调子,活字格是个好东西,大家一起学习,共同进步。

看看我的帖子,我写成自定义函数了下载js,直接用ROUNDS()

lovert 发表于 2021-8-23 00:01:51

dtcq 发表于 2021-8-22 21:31
我编程是个半调子,活字格是个好东西,大家一起学习,共同进步。

我也是检测行业的,不过我是公路试验检测的,目前我正在学习插件开发,刚刚做了两个简单的插件

lovert 发表于 2021-8-23 17:09:56

我的公式
页: [1] 2
查看完整版本: 四舍六入五留双公式,检测同仁有用