本帖最后由 RunAway 于 2023-1-24 23:13 编辑
模块版本:10.4.5
所用系统:win11
命令名称:时间_取现行时间戳
BUG描述:返回错误的浮点数文本
@项目部004
说起来其实多年前就遇到过这个bug,当时我用来做时间判断的
用的 到长整数(时间_取现行时间戳(假)) 对比之前记录值 来判断时间经过了多少毫秒
结果总是触发一个奇怪的bug 就是新时间戳的值居然比旧时间戳的值要小 导致报错各种问题
当时没找到原因 就没想那么多 直接简单粗暴直接*1000完事
而今天敲代码又出现了这个bug 调试了好久也没找到问题所在 一编译出来就报错。。
简单的写了个测试代码 终于找出了问题所在,以下是测试代码
这个bug本来就是个小问题,坑就坑在 调试的时候根本就不会出问题 直接用易语言编译和静态编译也不会,只要一用黑月编译立马就出问题
正好之前看过一篇文章说浮点数精度丢失问题 这个值一看就是典中典
翻开精易模块源码 一眼就看出了问题所在 就是这个取时间间隔的双精度浮点数转换的时候 变成了 1674524806.000001 解决办法到文本之前先到长整数即可
修改之后再次编译运行,问题完美解决
以下是修复版本的代码 (仅修复原本代码中的bug。模块里其实有更好的取时间戳命令比如 时间_取现行时间戳1() )
变量名 | 类 型 | 静态 | 数组 | 备 注 | 时间b | 精易_时间 | | | 返回值 | 文本型 | | | 毫秒数 | 文本型 | | | 时间a | 文本型 | | | GetLocalTime (时间b )毫秒数 = 取重复文本 (3 - 取文本长度 (到文本 (时间b.毫 )), “0”) + 到文本 (时间b.毫 )时间a = 到文本 (到长整数 (取时间间隔 (取现行时间 (), 到时间 (“1970-01-01 08:00:00”), #秒 )) )返回值 = 时间a + 毫秒数 判断 (是否取十位时间戳 )返回值 = 取文本左边 (返回值, 10 )判断循环首 (取文本长度 (返回值 ) < 10 )返回值 = 返回值 + “0”判断循环尾 ()返回 (返回值 )判断循环首 (取文本长度 (返回值 ) < 13 )返回值 = 返回值 + “0”判断循环尾 ()返回 (返回值 )
|