2017-03-09 79 views
0

我在數據庫中的以下值「4.6144444444」作爲BigDecimal這符合'04切毫秒:在時間圖案51' :36。從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」中刪除?

自從我加入了在瑤池報告這些值來計算的總和。

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

0時07分10秒+ 4點36分51秒+零點44分52秒+ 0時56: 51 = 6點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(這將是很難給出如何彩車工作),最終結果4點36分51秒(這是很容易的),將其刪除或? :) – Roelant

回答

1

所以花車困難的原因,他們不是精確的,但是,漂浮。一個很好的解釋可以在例如維基百科https://en.wikipedia.org/wiki/Floating-point_arithmetic

在你的情況下,你會直覺地想要從4.614166666666667的初始數字中刪除0.99999984/3600=0.00027777773333333334。但這會導致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腳本中的數據,然後在jasper報告中呈現它們,併爲我啓動:) – water