我在Python中将一些浮点数(有些更短一些更长)转换为字符串并获得意外(?)结果:
案例1
pd.options.display.float_format = '{:.2f}'.format
pd.DataFrame({'x': [12345.67]})
x
0 12345.67
案例2
pd.DataFrame({'x': [1234589890808980.67]})
x
0 1234589890808980.75
案例3
pd.DataFrame({'x': [1234589890878708980.67]})
x
0 1234589890878708992.00
我甚至尝试了dtypes np.float128
和np.longdouble
,但没有用。
有人可以解释一下这里发生了什么,并且在案例2和案例3中是否可以“正确”转换?
谢谢!
答案 0 :(得分:3)
我害怕这个"问题"发生在Python(而不是pandas)方面。当你有一些像1234589890878708980.67
这样的即时值时,它会被识别为float
并立即失去精确度,例如:
>>> 1234589890878708980.67
1.234589890878709e+18
>>> 1234589890878708980.67 == 1234589890878708980.6712345
True
您可以尝试使用decimal.Decimal
:
>>> import decimal
>>> pd.DataFrame({'x': [decimal.Decimal('1234589890808980.67')]})
x
0 1234589890808980.67
<强>编辑:强>
OP在评论中添加了一些问题。
但是,我是否理解为了正确使用此方法,该值应该首先是字符串?
是的:)
如果它从csv文件读取浮动怎么办?
AFAIK Python的csv
读者不得进行任何类型转换,并且您将获得可以在以后自由转换的字符串。否则,如果您正在使用pandas.read_csv
,则可以尝试设置dtype
和float_precision
参数(您也可以请求pandas加载纯字符串,并让您自己稍后转换值)