我必须创建一个具有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
答案 0 :(得分:2)
如果time
以timeUnitsType
为单位,并且您将该时间(以其单位为单位)转换为毫秒,则始终存在溢出的可能性。 long
根本不能超过19位数,而在这里你可以有32位6位小数,以秒为单位转换为毫秒将使它达到35位数。 32位数天到毫秒甚至更糟......
您确定需要将其BigDecimal
中的TimeUnit
转换为单个long
,以毫秒为单位吗?
BigDecimal.longValueExact()
将抛出异常。因此,如果您检查该异常并处理它,那么我猜一切都会好的。
答案 1 :(得分:2)
有一个原因是您在传入值中允许最多6个小数位,因此您不能忽略它们。自己进行转换,创建一个保留小数位的新BigDecimal。一旦你有毫秒,绕过那个BigDecimal。最后,将BigDecimal与Long.MAX_VALUE和MIN_VALUE进行比较。如果超出这些范围,则抛出异常。