通过浮点数比较筛选表中数据时结果不对是怎么回事

版本:2.00.8 linux

问题描述:通过浮点数比较筛选表中数据时结果不对,如下所述,选>2679.999999999999545 的数据的时候没返回 2680 这一条

首先,通过对 level2 数据进行因子计算,得到如下一个表

attachments-2022-11-aSnIhuYM638027ea68ced.png

然后再从表中选 factorValue > percentile(factorValue, 80) 的数据。

计算发现:percentile(factorValue, 80) = 2679.999999999999545 (则上图中数据应该有 2 条符合条件:80329.0602 和 2680) 

attachments-2022-11-i6nJQ4Yv63802a2b7e73f.png
但是筛选的时候,只返回了 1 条数据,没有 2680 这一条数据
attachments-2022-11-cqiN3eTJ63802974cecd3.png


请先 登录 后评论

1 个回答

NA

这个应该不是大小比较的问题,因为 2680 > 2679.999999999999545 的结果是 true。

应该是 GUI 显示的数据精度的问题。

GUI 默认的应该是显示小数点后 4 位。所以,实际计算获得的因子值可能是 2679.99999 ,在 GUI 显示就是 2680。

attachments-2022-11-K69yjHgU63802e1f427ad.png

解决方案:

首先,可以通过调整 GUI 显示的小数位数,比如调成 16,来查看实际的因子值,看是否是上述原因导致。

attachments-2022-11-4SZvhwJp63802f822c300.pngattachments-2022-11-J4FUHk6263802fbad9665.png

如果是上述问题,又需要 factorValue 的数据成为 2680.0,则可以通过 round 函数控制数据的小数位数。

// 构造数据
HTSCSecurityID = take(`600000.SH, 6)
MDDate = take(2022.04.01, 6)
MDTime = 13:00:00.000 + 1..6 * 3000
factorValue = 0 0 0 80329.0602 751 2679.99999
resultTable = table(HTSCSecurityID, MDDate, MDTime, factorValue)

// 筛选 > 2679.999999999999545 数据  
select * from resultTable where round(factorValue, 4) > 2679.999999999999545 


请先 登录 后评论
  • 1 关注
  • 0 收藏,899 浏览
  • 提出于 2022-11-25 10:41