2016-05-02 23 views
3

私はかなりの数日間コードを作成しています。正直言って、髪が残っていません...私はstackoverflowを含めてどこでも検索しています私の苦境に匹敵するものに小数点以下2桁までの小計の防止

Mint 17.3でpython 2.7.6を使用しています。 日付/時刻を少なくともミリ秒の精度で処理する必要があります。秒単位での日付と時間の処理はかなり簡単ですが、ミリ秒またはマイクロ秒で投げ込むと、まったく別のボールゲームになります。最終的には、ログファイルを繰り返し処理する必要があり、特定の条件に基づいて、2行の日付/時刻の違いを少なくともミリ秒の精度に合わせる必要があります。精密さは、サーバ、PLC、およびスキャナがこの倉庫のコンベア状況に関与している場合、実際に重要です。ログファイルの日付/時刻は、次のようにフォーマットされます。

12-Apr-2016 23:59:59.720321 

私はこれに対処する最も簡単な方法を考えたタイムスタンプの中に文字列を変換して、その後マイクロ秒を追加することでした。とにかくtimetuple()が何らかの分数を取り除くことがわかっているので、私はこの文脈でstrptimeを使用することについてもあまりよく分かりません。

はとにかく、多くの、多くの試行、および日後に、このための私のコードは、これまでに以下の通りです:

def timestampthen(timestring): 
    tt = datetime.datetime.strptime(timestring, "%d-%b-%Y %H:%M:%S.%f").timetuple() 
    ut = float(calendar.timegm(tt)) 
    dotpos = timestring.rfind(".") 
    frac = float(timestring[dotpos:]) 
    utfloat = float(ut + frac) 
    return utfloat 
例で

、UT = 1460505599.0とFRAC = 0.720321、まだutfloat = 1460505599.72

私はformatと%fを使うことができますが、私は浮動小数点数を扱い、文字列は扱っていません。 上記のコードは正常に動作しますが、浮動小数点数が6以上の場合、浮動小数点は2小数点精度で戻ってくるのはなぜですか?もっと必要。 私は適切な方向に私を指し示すためにいくつかの指針をお願いします。

+1

私はあなたのコードを実行しますが、私のために 'utfloat'は' 1460505599.720321'です。あなたのutfloatが丸みを帯びているとはどういうことができますか?印刷物? 'utfloat> 1460419273.37'は何を返しますか? – Francesco

+0

私は例ログ出力を反映するために例を変更しました –

+0

私のためのutfloatは四捨五入されています。私のデバッガを使用すると、丸められます。これは私のIDE(Wing pro)またはコマンドラインの中に出力されます: - '1460419273.0 0.373317 1460419273.37 –

答えて

3

完全精度が実際に存在するため、算術に問題はありません。

問題は、デフォルトでは、代わりにその完全な精度の変数の丸みを帯びたSTRを表示printのreprことです:

>>> ut = 1460505599.0; frac = 0.720321; 
>>> ufloat = ut + frac 
>>> print str(ufloat) 
1460505599.72 
>>> print repr(ufloat) 
1460505599.720321 

だから、あなたの問題を解決するには、ちょうどを印刷しますfloat値のreprになるため、完全精度で表示されます。これがうまくいくといいですね:-)

+0

こんにちは、私はそれを行うことができますが、私の質問と同様に、私は浮動小数点として高い精度のタイミングで動作する必要があります、算術を実行し、それらを印刷しないでください。 strとreprは文字列を返します。浮動小数点の値が隠れているのはなぜですか?それをどうやって知ることができますか?彼らは丸みを帯びていると思ったので、私の混乱。 –

+0

ちょうど算術演算を行い、精度はすでにそこにあります。 –

+0

ありがとうございます。私は先に進み、何が起こるか見る。 –

関連する問題