从BigDecimal值

时间:2017-03-09 07:54:37

标签: java groovy jasper-reports

我有以下价值' 4.6144444444'在数据库中BigDecimal符合“04:36:51'在时间模式。

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

此值为0.866666664 * 60 = 51.99999984秒,总数为' 36:51.99999984'。有没有办法削减' 0.99999984'的时间价值?来自' 4.6144444444'?

因为我在Jasper报告中将这些值相加以计算总和。

0.1197222222 + 4.6144444444 + 0.7480555555 + 0.9475000000 = 6.4297222221 ==> 06:25:46 999 999 56

00:07:10 + 04:36:51 + 00:44:52 + 00:56:51 = 06:25:44

结果也有两秒的差异。有没有办法在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;

在Jasper

在jasper中,我正在渲染以下内容:

        <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>

1 个答案:

答案 0 :(得分: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);

(代码未经测试)