2017-03-09 3 views
0

データベースに次の値 '4.6144444444'があり、時刻パターンに'04:36:51 'に適合するBigDecimalがあります。BigDecimal値からミリ秒を切り捨てました

4.6144444444 * 3600 0000 = 16611999.99984/1000 = 16611.99999984秒= 276.866666664分です。

この値0.866666664 * 60 = 51.99999984秒も合計で'04:36:51.99999984 'です。 '0.99999984'の時間値を '4.6144444444'から削除する方法はありますか?

合計を計算するために、これらの値をJasper Reportに追加しています。

0.1197222222 + 4.6144444444 + 0.7480555555 + 0.9475000000 = 6.4297222221 ==> 6時25分46秒999 999 56

0時07分10秒+ 4時36分51秒+ 0時44分52秒+ 0時56: 51 = 06:25:44

また、結果に2秒間の差があります。 JavaやJasperで管理する方法はありますか?ジャスパーの

コード

 def duration = rowTemp[7]; 
     def durationMiliseconds = duration * 3600000; 
     def durationSeconds = durationMiliseconds/1000; 
     def durationMinutes = (durationSeconds/60).toString(); 

     String[] durationMinutesSplitt = durationMinutes.split("."); 
     def secondsPart = Double.parseDouble("0." + durationMinutesSplitt[1]); 
     def secondWithMiliSeconds = secondsPart * 60; 

ジャスパーで

私は次のようvlaueをレンダリングしています:

 <textField isStretchWithOverflow="true" isBlankWhenNull="true"> 
      <reportElement stretchType="RelativeToTallestObject" x="252" y="2" width="149" height="18" /> 
      <box topPadding="2" leftPadding="2" bottomPadding="2" rightPadding="2"/> 
      <textElement textAlignment="Right" verticalAlignment="Middle"> 
       <font size="8" isBold="true" pdfFontName="Helvetica-Bold"/> 
       <paragraph lineSpacing="Single"/> 
      </textElement> 
      <textFieldExpression><![CDATA[org.apache.commons.lang.time.DurationFormatUtils.formatDuration((long)$V{group1DurationStay}.doubleValue() * 3600000, "HH:mm:ss")]]></textFieldExpression> 
     </textField> 
+0

は、あなたが今計算を行う方法のコードのビットを示してもらえますか? – Roelant

+0

@ Roelant:自分のコードを追加しました – water

+0

元の値4.614444444(これは浮動小数点の扱いが難しい)または最終結果04:36:51(これは簡単です)から削除しますか? :) – Roelant

答えて

1

彼らは正確ではありません原因ので山車が難しく、しかし、よく、浮動小数点。良い説明は、例えば、ウィキペディアhttps://en.wikipedia.org/wiki/Floating-point_arithmetic

0.99999984/3600=0.00027777773333333334を直ちに最初の番号から削除したい場合は4.614166666666667となります。しかし、それは51.000000000001364(浮動小数点の仕組みのために)になります。

あなただけの最終結果を気にしている場合、考慮

def duration = rowTemp[7]; 
def durationSeconds = duration*3600; 
def durationMinutes = (durationSeconds/60); 
def secondsPart = durationMinutes - floor(durationMinutes) 
def secondWithMiliSeconds = secondsPart * 60; 
def secondWithoutMiliSeconds = floor(secondsPart * 60); 

(コードがテストされていない)

+0

私は、私のケースでは、ジャスパーのレポートでレンダリングする前にGroovyスクリプトのデータを編集する能力を持っています。 – water

関連する問題