python保持十进制与字符串完全一样
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python保持十进制与字符串完全一样相关的知识,希望对你有一定的参考价值。
我是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'
然后我试图将它们转换为浮点数,这给了我以4999的3个内存结束的值
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,并在控制台中正常工作,返回所需的值,但是当我尝试将其应用于整个数据集时,它不会
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
有没有人知道如何解决这个问题?我一直在尝试谷歌,但找不到解决方案。
非常感谢。
我有一些好消息和坏消息。
坏消息是在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)。
通常我会使用字符串或圆函数的打印格式。
https://docs.python.org/3/library/functions.html?highlight=round#round
因为您使用的是十进制,所以可以通过改变精度来满足您的要求
https://docs.python.org/3/library/decimal.html?highlight=round
以上是关于python保持十进制与字符串完全一样的主要内容,如果未能解决你的问题,请参考以下文章
终于懂了:Delphi重定义消息结构随心所欲,只需要前4个字节是消息编号就行了,跟Windows消息虽然尽量保持一致,但其实相互没有特别大的关系。有了这个,就有了主动,带不带句柄完全看需要。(代码片段