Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将持续时间(BigDecimal值和时间单位)转换为毫秒长_Java_Converter_Long Integer_Bigdecimal_Duration - Fatal编程技术网

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

Java 将持续时间(BigDecimal值和时间单位)转换为毫秒长,java,converter,long-integer,bigdecimal,duration,Java,Converter,Long Integer,Bigdecimal,Duration,我必须创建一个具有2个输入参数的函数: 时长以大十进制表示(精度38,刻度6) 和 TimeUnitsType enum(天、小时、分钟或秒) 我需要得到long值(毫秒)作为结果; 据我所知,BigDecimal中的longValue()方法在这里无法精确工作,因为它将scale设置为0,longValueExact()将抛出算术异常(“溢出”)(因为精度-scale>19) 因此,我需要对每个案例分别进行单独计算。你能帮帮我吗?BigDecimal操作让我有点害怕,因为我以前没有使用过:)并

我必须创建一个具有2个输入参数的函数:
时长
以大十进制表示(精度38,刻度6) 和
TimeUnitsType enum
(天、小时、分钟或秒)

我需要得到
long
值(毫秒)作为结果; 据我所知,
BigDecimal
中的
longValue()
方法在这里无法精确工作,因为它将scale设置为0,
longValueExact()
将抛出
算术异常(“溢出”)
(因为精度-scale>19)

因此,我需要对每个案例分别进行单独计算。你能帮帮我吗?BigDecimal操作让我有点害怕,因为我以前没有使用过:)并且在任务的其余部分需要精度


p.S.Java版本是1.6

如果
时间
是以
时间单位Type
为单位的,并且您正在将该时间(以其单位)转换为毫秒,则始终存在溢出的可能性
long
的长度不能超过19位,而在这里,您可以在几秒钟内拥有32位小数点后6位,将其转换为毫秒将使其最多为35位。32位数的天数到毫秒更糟糕

是否确实需要将其
时间单位
中的
BigDecimal
转换为单个
(以毫秒为单位)


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

如果
time
是以
timeUnitsType
为单位的,并且您正在将该时间(以毫秒为单位)转换为毫秒,则始终存在溢出的可能性
long
的长度不能超过19位,而在这里,您可以在几秒钟内拥有32位小数点后6位,将其转换为毫秒将使其最多为35位。32位数的天数到毫秒更糟糕

是否确实需要将其
时间单位
中的
BigDecimal
转换为单个
(以毫秒为单位)


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

有一个原因,您允许传入值中最多有6个十进制位置,因此您不能忽略它们。自己进行转换,创建一个保留小数位置的新BigDecimal。一旦有了毫秒,就把那个大十进制四舍五入。最后,将BigDecimal与Long.MAX_值和MIN_值进行比较。如果超出了这些界限,则抛出异常。

有一个原因,就是在传入值中最多允许6个十进制位置,所以不能忽略它们。自己进行转换,创建一个保留小数位置的新BigDecimal。一旦有了毫秒,就把那个大十进制四舍五入。最后,将BigDecimal与Long.MAX_值和MIN_值进行比较。如果超出这些界限,则抛出异常。

请准确定义
bigdecime
表示的是什么。
time
持续时间是否以
timeUnitsType
为单位,或者
time
是否以自己的单位,并转换为
timeUnitsType
中的等效持续时间?请准确定义
bigdecime
表示的是什么。
time
持续时间是否以
timeUnitsType
为单位,或者
time
是否以自己的单位,并在
timeUnitsType
中转换为等效持续时间?是的,我需要在这里转换为毫秒(这是一项要求),因为需要进行大量的进一步计算,并且应该有一种格式。因此,据我所知,我可以使用longValueExact()结果将其异常包装到我的自定义异常中,对吗?是的,
BigDecimal.longValueExact()
将在任何信息丢失时引发异常。所以,如果你检查这个异常并处理它,我想一切都会好起来。谢谢,我会检查这个是否正确。如果是这样的话,这当然是最简单的解决方案。@alexkov如果这回答了您的问题,那么我们将非常感谢您的“接受”。是的,我需要在这里转换为毫秒(这是一项要求),因为有很多进一步的计算,并且应该有一个单一的格式。因此,据我所知,我可以使用longValueExact()结果将其异常包装到我的自定义异常中,对吗?是的,
BigDecimal.longValueExact()
将在任何信息丢失时引发异常。所以,如果你检查这个异常并处理它,我想一切都会好起来。谢谢,我会检查这个是否正确。如果是这样,这当然是最简单的解决方案。@alexkov如果这回答了您的问题,那么我们将非常感谢您的“接受”。
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);
    }
}