计算录音显示时长——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();
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BigDecimal 是 Java 中提供的一个用于精确计算的类,它可以处理任意大小和精度的数值。与基本数据类型的浮点数相比,BigDecimal 提供了更高的精度和更可靠的计算结果。 使用 BigDecimal 进行计算时,需要注意以下几点: 1. 创建 BigDecimal 对象:可以通过传入字符串、整数或双精度数值来创建 BigDecimal 对象,例如: ```java BigDecimal num1 = new BigDecimal("10.5"); BigDecimal num2 = new BigDecimal(5); ``` 2. 使用方法进行计算BigDecimal 提供了一系列的方法用于进行加减乘除等计算,这些方法会返回一个新的 BigDecimal 对象作为计算结果,而不会修改原有对象。例如: ```java BigDecimal sum = num1.add(num2); // 加法 BigDecimal difference = num1.subtract(num2); // 减法 BigDecimal product = num1.multiply(num2); // 乘法 BigDecimal quotient = num1.divide(num2, RoundingMode.HALF_UP); // 除法,指定舍入模式 ``` 3. 舍入模式:在进行除法运算时,需要指定舍入模式。常见的舍入模式包括 HALF_UP(四舍五入)、HALF_DOWN(五舍六入)、CEILING(向正无穷方向舍入)等。可以根据实际需求选择适合的舍入模式。 4. 精度设置:BigDecimal 可以通过设置精度来控制小数位数,可以使用 `setScale` 方法进行设置,例如: ```java BigDecimal result = num1.divide(num2, 2, RoundingMode.HALF_UP); // 除法并设置小数位数为2 ``` 需要注意的是,由于 BigDecimal 是不可变类,每次进行计算都会返回一个新的对象,因此在连续计算时需要适时保存中间结果。 希望以上信息能对你有所帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值