我在python中处理一个具有浮动类型字段的.CSV文件。
必须修改此字段,使其至少包含4个小数点和最多8位小数点。
示例:
input: 5.15
output: 5.1500
input: -12.129999998
output: -12.12999999
我目前正在做的事情:
#The field to be modifed is present at index 3 in list temp
dotIndex = temp[3].find('.') + 1
latLen = len(temp[3])-1
if (latLen) - (dotIndex) > 8:
temp[3] = temp[3][0:dotIndex+4]
elif (latLen) - (dotIndex) < 4:
temp[3] = temp[3][0:latLen] + (4 - (latLen - (dotIndex))) * '0'
有没有更好的方法来编写此代码以提高性能?
答案 0 :(得分:2)
这应该有效:
temp[3] = "{:.4f}".format(float(temp[3]))
考虑到您的评论以及您希望将其截断的事实,请转到:
n = len(temp[3].split('.')[1])
if n < 4:
temp[3] = "{:.4f}".format(float(temp[3]))
elif n > 8:
parts = temp[3].split('.')
temp[3] = parts[0]+"."+parts[1][:4]
答案 1 :(得分:1)
如果你是截断,而不是舍入,你可以使用这样的东西:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<ns1:NotifySOAPHeader xmlns:ns1="http://www.huawei.com.cn/schema/common/v2_1">
<ns1:traceUniqueID>504021505821207281129180006002</ns1:traceUniqueID>
</ns1:NotifySOAPHeader>
</soapenv:Header>
<soapenv:Body>
<ns2:processRequest xmlns:ns2="http://b2b.mobilemoney.mtn.zm_v1.0/">
<serviceId>101</serviceId>
<parameter>
<name>ProcessingNumber</name>
<value>12121212</value>
</parameter>
<parameter>
<name>senderID</name>
<value>MOM</value>
</parameter>
<parameter>
<name>AcctRef</name>
<value>112233</value>
</parameter>
<parameter>
<name>RequestAmount</name>
<value>1212</value>
</parameter>
<parameter>
<name>paymentRef</name>
<value>12121</value>
</parameter>
<parameter>
<name>ThirdPartyTransactionID</name>
<value>12112</value>
</parameter>
<parameter>
<name>MOMAcctNum</name>
<value>121212</value>
</parameter>
<parameter>
<name>CustName</name>
<value>121212</value>
</parameter>
<parameter>
<name>TXNType</name>
<value>12121</value>
</parameter>
<parameter>
<name>StatusCode</name>
<value>12121</value>
</parameter>
<parameter>
<name>OpCoID</name>
<value>0</value>
</parameter>
</ns2:processRequest>
</soapenv:Body>
</soapenv:Envelope>
将10乘以8的幂,取整数部分,然后除以10得到幂8,得到所需的截断。但请注意,这将始终返回一个带有8位小数的值 - 因此5.15变为5.15000000。
你可以这样说,例如:
def truncate_to_eight(val):
return '{:.8f}'.format((int(val * 10**8))/(10.0**8))