3 dolpindb除法和精度严重BUG

处理数据精度出现严重问题,请问如何解决?

1,使用简单的变量复测试出现如下问题:


v=2638
o=9.8
c=9.9
typestr(v)//输出:INT
typestr(o)//输出:DOUBLE
typestr(c)//输出:DOUBLE
v\(c-o)==26380//输出:false
aa=v\(c-o)
print(aa)//输出:26380.000000000094587          
//问题1:此处为什么不是整除,导致明明可以整除的结果却出现多余的小数,
//这在分析查询时使用条件‘==’‘<=’等逻辑时会漏掉应有的数据
typestr(aa)//输出:DOUBLE
float(v\(c-o))==26380//输出:true
bb=float(v\(c-o))
print(bb)//输出:26380
//问题2:对于能整除的数据不可能都用Float去截断数据吧?
v/(c-o)>26380//输出:true
cc=v/(c-o)
print(cc)//输出:26380.000000000094587
typestr(cc)//输出:DOUBLE
//问题3:对于‘/’‘\’两种除法文档的解释是‘/’会取整,此处除数为小数,可整除的情况下并未取整



请先 登录 后评论

4 个回答

Xiaohua Zhou

浮点数都是有精度的。出现 26380.000000000094587这样的数字,整数后面跟一个非常小的小数,是正常的。所以浮点数的比较需要考虑精度。

请先 登录 后评论
TomZhang - 软件开发工程师

浮点数比较是差值和很小的值比大小  举例如下:

a=0.9
b=0.8
c=1\(a-b)
print(string(c)) //10.000000000000001
abs(c-10)< 0.0000001  //true


请先 登录 后评论
naxi

建议您百度学习一下浮点数比较。浮点数比较需要考虑精度,是基本常识,不是bug。

https://www.jianshu.com/p/4679618fd28c

https://blog.csdn.net/qq_39131699/article/details/83449400
https://blog.csdn.net/slience_646898/article/details/80954464

这是用百度搜索“浮点数比较”排在前三位的文章,建议您学习一下。



请先 登录 后评论
Boye

DolphinDB有个函数eqFloat用于浮点数比较。详见 eqFloat — DolphinDB 2.0 文档

请先 登录 后评论
  • 4 关注
  • 0 收藏,1666 浏览
  • 空空如也 提出于 2021-10-18 18:38