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

时间:2017-12-06 13:50:30

标签: java converter long-integer bigdecimal duration

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

我需要得到long值(毫秒)作为结果; 据我了解,来自longValue()的{​​{1}}方法在此处不会正常工作,因为它将比例设置为0,BigDecimal将抛出longValueExact()(因为精度 - 比例) > 19)

ArithmeticException("Overflow")

所以我需要分别对每个案例进行单独计算。你能帮我么? BigDecimal操作让我有点害怕,因为我之前没有和它们一起工作:)并且在剩下的任务中需要精度。

P.S。 Java版本是1.6

2 个答案:

答案 0 :(得分:2)

如果timetimeUnitsType为单位,并且您将该时间(以其单位为单位)转换为毫秒,则始终存在溢出的可能性。 long根本不能超过19位数,而在这里你可以有32位6位小数,以秒为单位转换为毫秒将使它达到35位数。 32位数天到毫秒甚至更糟......

您确定需要将其BigDecimal中的TimeUnit转换为单个long,以毫秒为单位吗?

如果丢失任何信息,

BigDecimal.longValueExact()将抛出异常。因此,如果您检查该异常并处理它,那么我猜一切都会好的。

答案 1 :(得分:2)

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