python保持十进制与字符串完全一样

时间:2017-12-17 11:29:38

标签: python pandas floating-point type-conversion decimal

我是Python的新手,我有一个小数问题,并且几分钟之后就无法弄清楚如何解决它。基本上我想读取带有pandas的CSV文件,并保持小数与文本中存储的完全一致,以便进行将来的比较和简单的数学运算。 所以这就是我对输入的看法:

is_string_dtype(report['item_weight_kg'])
Out[12]: True
l = report.loc[report['item'] == 'B0WY']
num1 = l['item_weight_kg'][8210]

num1
Out[14]: '22.000370049504'

然后我试图将它们转换为float,这给了我以 3 4

3999 结尾的值
report['item_weight_kg'] = report.apply(lambda x: float(x['item_weight_kg']), axis = 1 )

l = report.loc[report['item'] == 'B0WY']
num1 = l['item_weight_kg'][8210]

num1
Out[17]: 22.000370049503999

导入数据集后,我尝试将其转换为float,并在控制台中正常工作,返回所需的值,但是当我尝试将其应用于整个数据集时,它并没有&# 39;吨

float(decimal.Decimal(l['item_weight_kg'][8210]))
Out[23]: 22.000370049504

report['item_weight_kg'] = report.apply(lambda x: float(decimal.Decimal(x['item_weight_kg'])), axis = 1 )    
l = report.loc[report['item'] == 'B0WY']
num1 = l['item_weight_kg'][8210]

num1
Out[25]: 22.000370049503999

有没有人知道如何解决这个问题?我一直试图谷歌,但无法找到解决方案。

非常感谢。

2 个答案:

答案 0 :(得分:0)

通常我会对字符串或圆函数使用打印格式。

https://docs.python.org/3/library/functions.html?highlight=round#round

因为您使用的是十进制,所以您可以通过更改精度来满足您的要求

https://docs.python.org/3/library/decimal.html?highlight=round

答案 1 :(得分:0)

我有一些好消息和坏消息。
坏消息是在python中:
0.1 + 0.2会给你0.30000000000000004
并且0.1 + 0.2 == 0.3会给False
这不仅仅是在python中。这种现象发生在非常多的编程语言中。事实上,有一个专门的网站! :https://0.30000000000000004.com/
您可以在官方python文档here中阅读更多相关信息。
问题是,处理浮点数很棘手,特别是当你尝试像你的情况那样进行精确的数学运算(即相等)时。
在处理花车时,绝对不要指望精确的数学!
相反,当您尝试检查浮动是否相等时,检查它们是否非常接近。 Python 3.5+提供了此功能(see here),您可以自己实现。
一个简单的浮点相等比较如下:

epsilon = 0.0000001 # the smallest acceptable precision error
def float_equals(a,b):
    return abs(a-b) <= epsilon

但是如果我们想要比标准python提供的更精确呢?
在这种情况下,您可以使用任意精度库,如mpmath。这是个好消息(也许是idk)。