2017-03-09 38 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