项目中测试人员反馈数据计算错误,经过定位发现是基础数据数据库中保留了6位,但是实际显示在页面中是保留两位小数,其中有一个字段是经过其他计算得到的,计算时未保留小数位。导致数字最后一位有问题。比如 a = 1.3657;b = 2.3556;c = 2.365;d = a +b+c;d =6.0836,当在页面显示时,a = 1.37;b=2.36;c=2.37;d = 6.09;而a+b+c = 6.10。类似这种情况。
遇到这个问题,当时有两种解决方法,一种是在页面取数据时,全部进行一次处理,然后重新计算d,这样页面显示的数据肯定没有问题;另一种就是从根本解决,在基础数据处理时就全部保留两位小数,后面考虑了下,选择了第二种,因为这样只需要修改底层基础数据处理就可以了。
由于基础数据处理那块功能是用python语言开发的,所以就有文章标题的问题。基础数据主要通过pandas库进行计算处理。简单问了下度老师,最后选择了pandas.round()方法。
pandas.DataFrame.round(decimals )
decimals : int, dict, Series
简单写了一个测试发现非常好用,如下面这个:
df = pd.DataFrame({"A": [1.55, 2.43, 3.14, 4.67], "B": [2.03, 6.98, 7.41, 8.32], "C": [0, 0, 0, 0]})
print(df)
df['C'] = df['A'].mul(df['B'])
df = df.round({'A': 1, 'C': 2})
print(df)
得到结果
D:\svn_project\flaskProject\venv\Scripts\python.exe D:/svn_project/flaskProject/test.py
A B C
0 1.55 2.03 0
1 2.43 6.98 0
2 3.14 7.41 0
3 4.67 8.32 0
A B C
0 1.6 2.03 3.15
1 2.4 6.98 16.96
2 3.1 7.41 23.27
3 4.7 8.32 38.85
但是拿到具体项目中发现怎么都没有起作用,保留在数据库中的数据还是多位。如下图
怎么调试都不起作用。苦恼了好久,后面终于发现F12_2008,F13_2008的列值数据类型不一致如下面
pandas.round()不能处理数据类型为object类型的数据。
这样就比较好办了,在保留小数位时,先将object类型数据转换为float类型,这样数据就能处理成功了,哈哈哈哈哈哈~~~~~
invest_pd['F13_2008'] = pd.to_numeric(invest_pd['F13_2008'], errors='coerce')
这么简单问题,困扰了一天,终于解决了,记录下。