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