计算录音显示时长——BigDecimal

xiaoxiao2021-02-28  85

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(); } }

转载请注明原文地址: https://www.6miu.com/read-65933.html

最新回复(0)