繁体   English   中英

将持续时间(BigDecimal值+时间单位)转换为毫秒长

[英]Convert time duration (BigDecimal value + time units) to milliseconds long

我必须创建一个具有2个输入参数的函数:BigDecimal中的Time duration (精度38,小数TimeUnitsType enum 6)和TimeUnitsType enum (DAYS,HOURS,MINUTES或SECONDS)。

结果,我需要获取long值(毫秒); 据我了解, BigDecimallongValue()方法在此处无法正确工作,因为它将scale设置为0,并且longValueExact()会抛出ArithmeticException("Overflow") (因为精度longValueExact() > 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操作使我有些害怕,因为我以前从未与他们合作过:)并且在其余任务中都要求精度。

PS Java版本为1.6

如果timetimeUnitsType为单位,并且您正在将该时间(以其单位)转换为毫秒,那么总会有溢出的机会。 long根本不能容纳超过19位数字 ,而在这里您可以拥有32位数字(以秒为单位)为6个小数位,并将其转换为毫秒将使其最多为35位数字。 32位数字天到毫秒甚至更糟...

你确定你需要将其转换BigDecimal在其TimeUnit到一个long以毫秒为单位?

如果丢失任何信息, BigDecimal.longValueExact()将引发异常。 因此,如果您检查并处理该异常,那么我想一切都会好的。

有一个原因,您允许在输入值中最多允许6个小数位,因此不能仅仅忽略它们。 自己进行转换,创建一个保留小数位的新BigDecimal。 一旦有了毫秒,就将BigDecimal舍入。 最后,将BigDecimal与Long.MAX_VALUE和MIN_VALUE进行比较。 如果超出这些范围,则引发异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM