我有一个这样的数据框(df):
euro token
200.0 65.78947368421053
9997.8 2631.0
每当只有 .0 时,我想摆脱 .0,但是当"欧元"中有像 .8 这样的小数时,我希望必须像您通常使用货币一样使用小数。 因此,"欧元"列的定义将是小数点后 2 位,除非只有 0。对于"token"列,它将是 18 位小数,当只有 0 时不显示尾随的 0 和没有小数。
我现在读了很多书,但甚至找不到从哪里开始。任何人?
关于更多问题的更新示例
import pandas as pd
import numpy as np
min_invest = 200
cps_exchange_rate_eur = Decimal(38) / Decimal(10)
df = pd.read_excel(file.xlsx,
index_col=None,
dtype={'euro': float},
na_values='NA'
)
print(df.head())
print(df.dtypes)
email euro
0 first@gmail.com 600.00
1 second@web.de 200.00
2 third@web.de 1997.80
3 fourth@gmail.com 200.00
4 fifth@gmx.ch 9997.80
email object
euro float64
dtype: object
现在我正在尝试修复 2 个小数点。
df.loc[:, 'euro'] = np.round(df['euro'], decimals=2)
df.loc[:, 'euro_cent'] = (df['euro'] * 100).astype(int)
print(df.head()
print(df.dtypes)
email euro euro_cent
0 first@gmail.com 600.00 60000
1 second@web.de 200.00 20000
2 third@web.de 1997.80 199779
3 fourth@gmail.com 200.00 20000
4 fifth@gmx.ch 9997.80 999779
email object
euro float64
euro_cent int64
dtype: object
如您所见,它在第 2 行和第 4 行中搞砸了。我不知道如何解决这个问题。
谢谢曼努埃尔
如果您需要存储的值精确到小数点后两位,那么您应该使用decimal
包进行算术。 如果要保持完全精度,但在输出时仅打印小数点后两位,请参阅有关 Python 格式的各种教程,例如"{:.2f}".format(euro)
。
对OP评论的回应
但是看看你是如何得到汇率的:你分配了一个float
值,所以它不再保证在10的基数中正好是3.8;相反,它是二进制中最接近的近似值。 我得到3.79999999999999982236431605997495353221893310546875
.
如果您希望从打印页面上看到的内容中获得确切的结果,则不能在计算中使用小数、非二进制数。 要获得精确的 3.8,请使用Decimal(38) / Decimal(10)
。
对下一条评论的回应
这是相同的问题:您使用的是读取类型float
的输入包,该输入包与文件中的数字字符串的表示形式不同。 分数.8
不能用二进制精确表示。 第 2 行和第 4 行搞砸了,因为您使用了float
值而不是Decimal
。 四舍五入到 2 位并不意味着计算机现在可以表示精确的百分之一;它只是意味着您获得最接近的可用值。 例如:
>>> np.round(0.8, 2)
0.80000000000000004
处理此问题的一种方法是在Decimal
中完成所有算术(包括起始值)。 另一种方法是接受微小的错误,直到需要打印或记录结果......然后在出路时四舍五入到小数点后两位。
您可以按照以下方式操作:
#sample
euro = [2, 2.3, 3.0, 4.0, 5.4444]
new_euro = [round(x) if x == round(x) else "{0:.2f}".format(x) for x in euro]
print(new_euro)
[2, '2.30', 3, 4, '5.44']