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.300000000000000040.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) &lt= 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消息虽然尽量保持一致,但其实相互没有特别大的关系。有了这个,就有了主动,带不带句柄完全看需要。(代码片段

python 包(多文件模块)的行为与一个大模块完全一样吗?

python课程设计笔记整数浮点数与字符串

python3 字符编码与转码 NLP第一条

添加到后台堆栈时如何保持片段状态?

python基础