2017-06-20 3 views
-1

私は浮動小数点型フィールドを持つPythonでa.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' 

は、パフォーマンスを向上させるために、このコードを書くための良い方法はありますか?

+1

ちょうどキャスト 'TEMP。 '{:8F}' 形式()) 'である。それがどれほど大きいかを確認したり、それをバフまたはカットしたりすることは大変な作業です。 –

+1

値を切り捨てようとしているのですか、実際に値を切り捨てようとしていますか? 2番目の例は、適切に四捨五入した場合、例えば13.13000000になります。 – asongtoruin

+0

@ason​​gtoruin私はそれらを切り詰めようとしています。 – noobcoder

答えて

2

これは動作するはずです:

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] 
+0

最大8ポイントの精度も可能です。 2番目の入出力例を確認してください。 – noobcoder

+0

また、n> 8の場合、temp [3] = "{:.8f}"と書けませんか? – noobcoder

+1

floatをフォーマットすると になるので、このメソッドを切り捨てたいときに使用してください – Trolldejo

1

あなたは四捨五入ではなく切り捨てている場合は、あなたが何かを使用することができます

temp[3] = "{:.4f}".format(float(temp[3])) 

あなたのコメント、あなたはそれがここ、切り捨てあなたが行きたいという事実を考慮するとDIV

def truncate_to_eight(val): 
    return '{:.8f}'.format((int(val * 10**8))/(10.0**8)) 

次いで、8のパワーに10を掛ける整数部分をとること、およびこのような10をパワー8にすると、切り捨てが必要になります。ただし、これは常に小数点以下8桁の値を返します。したがって、5.15は5.15000000になります。

あなたが例えば、言って、これを使用することになり

:[3] `浮くし、その後`プリント(のようなものでそれを書き戻す

rounded = truncate_to_eight(temp[3]) 
関連する問題