我必须创建一个包含两个输入参数的函数:Time duration in BigDecimal (精度38,scale 6)和TimeUnitsType enum (天、小时、分钟或秒)。
因此,我需要得到long值(毫秒);据我所知,BigDecimal的longValue()方法在这里不能精确地工作,因为它将标度设置为0,而longValueExact()将抛出ArithmeticException("Overflow") (因为精度比例尺> 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操作让我有点害怕,因为我以前还没有使用过它们:),其余的任务都需要精确性。
P.S.Java版本为1.6
发布于 2017-12-06 14:20:52
如果time位于timeUnitsType的单位中,并且您将该时间(单位)转换为毫秒,则始终存在溢出的可能性。long不能容纳超过19位数字,而在这里,您可以有32位数字--6位小数位数--并将其转换为毫秒,将其转换为35位数字。32位数天到毫秒更糟..。
您确定需要以毫秒为单位将此BigDecimal在其TimeUnit中转换为单个long吗?
如果有任何信息丢失,BigDecimal.longValueExact()将抛出异常。所以如果你检查这个异常并处理它,我想一切都会好起来的。
发布于 2017-12-06 14:29:06
有一个原因是,您允许在传入值中最多有6个小数位,所以您不能忽略它们。自己进行转换,创建一个保留十进制位置的新BigDecimal。一旦您有毫秒时间,绕过该BigDecimal。最后,将BigDecimal与Long.MAX_VALUE和MIN_VALUE进行比较。如果它超出了这些界限,抛出一个异常。
https://stackoverflow.com/questions/47675939
复制相似问题