1

Ruby を使用して、Java と同様の 64 ビットのタイムスタンプを生成しています。Class:Timeを調べたところ、時間は 63 ビット整数を使用できると書かれています。私は使用できると思いました:

Time.now.to_f * 1000

しかし、浮動小数点変換による精度の低下が心配です。RubyのJavaのように、64ビットのタイムスタンプ(エポックからのミリ秒)をできるだけ正確に取得できますか?

Calendar.getInstance().getTimeInMillis();

タイムスタンプをデータベース内の一意の ID として使用する必要があるため、時間に関連する衝突を最小限に抑え、存在しないようにしたいと考えています。

4

2 に答える 2

2

とにかくこれは本当にすべきことではないことを示唆するコメントを追加しましたが意味のある方法で精度を失うことを心配する必要はないと思います. Ruby のドキュメントには、値がナノ秒単位で格納されると記載されています。それを浮動小数点数に変換すると、最後の数桁が失われる可能性がありますが、ミリ秒レベルでは意味がありません。結局のところ、値が少し切り上げられたり切り下げられたりしても気にしません...ミリ秒ごとに 1 つのエントリを作成するだけに頼っています。

to_i別の方法として、andを使用する方法があります。 の結果に1000nsecを掛け、 の結果を1000000 で割り、2 つを加算します。これにより、整数演算のみを使用してミリ秒数が取得されます。to_insec

于 2013-09-12T07:15:48.283 に答える
2

時間はJavaで長く署名されているため、63ビットでもあります。

それで、今年はオーバーフローするのではないかと心配していますか?個人的には、それまでに Java を使用する人はいないと思います。実際、私たちもその時までに絶滅/進化している可能性があります。

  System.out.println("Overflow at " + new Date(Long.MAX_VALUE));

版画

  Overflow at Sun Aug 17 08:12:55 CET 292278994

注: 2 億 9200 万年前は、恐竜が地球を支配する前のことです。


ナノ秒のタイム スタンプを double に変換する際の精度の低下が懸念される場合は、その誤差を計算できます。

long now = System.currentTimeMillis() * 1000000L;
double error_f = Math.ulp((float) now);
double error = Math.ulp((double) now);

System.out.println("The error for a nano-second timestamp using a double "
        + now + " is " + error + " and float is " + error_f);

版画

The error for a nano-second timestamp using a double 1378970569656000000 is 256.0 and float is 1.37438953472E11

これは、への変換の誤差doubleが最大でこの半分の 128 ns であることを意味します。float への変換の場合、誤差も ulp の半分の 68 秒であり、かなり高い値です。

于 2013-09-12T07:13:56.460 に答える