2017-12-06 14 views
0

:BigDecimalの中 Time duration(精度38、スケール6) と TimeUnitsType enum(日、時間、分、またはSECONDS)。変換時間(ミリ秒)の持続時間(BigDecimal値+時間単位)長い

そして結果としてlong値(ミリ秒)を取得する必要があります。私が理解として、それが0に規模を設定するよう は、BigDecimalからlongValue()方法は、正確に、ここでは動作しません、とlongValueExact()がスローされますArithmeticException("Overflow")(なぜなら精度 - > 19スケール)

public static long convertTimeToMillis(BigDecimal time, TimeUnitsType timeUnitsType) { 
    long timeLong = time.longValue(); 
    switch (timeUnitsType) { 
     case DAYS: 
      return TimeUnit.DAYS.toMillis(timeLong); 
     case HOURS: 
      return TimeUnit.HOURS.toMillis(timeLong); 
     case MINUTES: 
      return TimeUnit.MINUTES.toMillis(timeLong); 
     default: 
      return TimeUnit.SECONDS.toMillis(timeLong); 
    } 
} 

は、だから私は、個々の計算をする必要があります各ケースごとに個別に手伝ってくれませんか? BigDecimalの操作は私が少し前に作業していないので少し怖いです:)そして残りの作業で精度が必要です。

P.S. Javaのバージョンは1.6

+0

「BigDecimal time」が表すものを正確に定義してください。 'time'の持続時間はtimeUnitsTypeの単位で表されていますか、それとも' timeUnitsType'のそれと同じ持続時間に変換されています。 – xtratic

答えて

2

timeの場合は、単位はtimeUnitsTypeで、その時間(単位はミリ秒)は常にオーバーフローの可能性があります。 longは、数字が小数点以下6桁、秒が32桁で、ミリ秒に変換すると35桁になりますが、ここでは19桁以上の数値を入力できません。 32桁の日数がさらに悪化しています...

このBigDecimalTimeUnitは、long(ミリ秒単位)に変換する必要がありますか?

BigDecimal.longValueExact()は、情報が失われた場合に例外をスローします。だから、もしあなたがその例外をチェックし、それを処理すれば、事態は大丈夫だろうと思います。

+0

はい、ここではmillisに変換する必要があります(これは要件です)。これにはさらに多くの計算があり、1つの形式が必要です。私が理解したように、私はlongValueExact()の結果を使用することができます。 – alexkov

+0

はい、BigDecimal.longValueExact()は、情報が失われた場合に例外をスローします。だから、もしあなたがその例外をチェックし、それを処理すれば、事態は大丈夫だろうと思います。 – xtratic

+0

ありがとう、私はこれが正確に動作するかどうかを確認します。もしそうなら、これは確かに最も簡単な解決法です。 – alexkov

2

着信する値に小数点以下6桁を許可する理由があるため、無視するだけではなりません。小数点位置を保持する新しいBigDecimalを作成して、変換を自分で行います。ミリ秒になると、そのBigDecimalを丸めます。最後に、BigDecimalとLong.MAX_VALUEおよびMIN_VALUEを比較します。それらの境界の外にある場合は、例外をスローします。

+0

いいアドバイスです、ありがとう! – alexkov

関連する問題