计算录音显示时长——BigDecimal

1.使用前

(1)设置一个显示的最小宽度80px,最大宽度420px;
(2)当录音时长小于60s时来控制显示中间的340px,大于60s则直接显示最大宽度;
2.使用及效果
int voiceLength = (int) (voiceFileBean.getDuration() / 1000);//duration为录音的时长,此处转化为秒
    if (voiceLength < 60) {
        double tempWidth  = 340;

        BigDecimal b1 = new BigDecimal(Integer.toString(voiceLength));
        BigDecimal b2 = new BigDecimal(Integer.toString(60));
        double rate = b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP).doubleValue();

        double finalWidth = rate * tempWidth  + 80;

        tvLength.getLayoutParams().width = (int) finalWidth;
        tvDuration.setText(voiceLength + "'");
    } else {
        tvLength.getLayoutParams().width = 420;//tvLength为显示的宽度图,tvDuration为显示的秒数
        tvDuration.setText(voiceLength / 60 + "'" + voiceLength % 60 + "'");
    }


3.BigDecimal
(1)简介
      java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。因此,BigDecimal表示的数值是(unscaledValue × 10-scale)。
(2)使用

    1> 尽量使用参数类型为String的构造函数。

    2> BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时一定要保存操作后的值。

(3)使用工具类

public class BigDecimalUtil {

    /**
     * 加法计算
     *
     * @param value1 被加数
     * @param value2 加数
     * @return 两个参数的和
     */
    public static double add(int value1, int value2) {
        BigDecimal b1 = new BigDecimal(Integer.toString(value1));
        BigDecimal b2 = new BigDecimal(Integer.toString(value2));
        return b1.add(b2).doubleValue();
    }

    /**
     * 减法计算
     *
     * @param value1 被减数
     * @param value2 减数
     * @return 两个参数的差
     */
    public static double sub(int value1, int value2) {
        BigDecimal b1 = new BigDecimal(Integer.toString(value1));
        BigDecimal b2 = new BigDecimal(Integer.toString(value2));
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 乘法计算
     *
     * @param value1 被乘数
     * @param value2 乘数
     * @return 两个参数的积
     */
    public static double mul(int value1, int value2) {
        BigDecimal b1 = new BigDecimal(Integer.toString(value1));
        BigDecimal b2 = new BigDecimal(Integer.toString(value2));
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 除法计算
     *
     * @param value1 被除数
     * @param value2 除数
     * @param scale  精确位数
     * @return 两个参数的商
     * @throws IllegalAccessException
     */
    public static double div(int value1, int value2, int scale) throws IllegalAccessException {
        //如果精确范围小于0,抛出异常信息
        if (scale < 0) {
            throw new IllegalAccessException("精确度不能小于0");
        }
        BigDecimal b1 = new BigDecimal(Integer.toString(value1));
        BigDecimal b2 = new BigDecimal(Integer.toString(value2));
        return b1.divide(b2, scale,BigDecimal.ROUND_HALF_UP).doubleValue();
        /**
         * BigDecimal.ROUND_DOWN:直接删除多余的小数位,如2.35会变成2.3
         * BigDecimal.ROUND_UP:进位处理,2.35变成2.4
         * BigDecimal.ROUND_HALF_UP:四舍五入,2.35变成2.4
         8 BigDecimal.ROUND_HALF_DOWN:四舍五入,2.35变成2.3,如果是5则向下舍
         */
    }

    /**
     * 提供精确的小数位四舍五入处理。
     * @param num 需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double num,int scale){
        if(scale<0){
            throw new IllegalArgumentException("精确度不能小于0");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(num));
        BigDecimal b2 = new BigDecimal("1");
        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值