package app.com.mybigdecimal;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
/**
* Created by Administrator on 2017/9/8.
*
* 不能用float,会丢失精度,最好是传入String类型
*
* double可以16位数不会丢失精度,多了就失精度
* float可以8位数不会丢失精度,多了就失精度
*
* 2.当浮点型数位太大时,直接加双引号或toString 会变成科学计数法
* Log.d("=====math",Double.toString(100000000.61d)); //1.0000000061E8
*
*
*
*
*/
public class MyMath {
public static double add(String d1, String d2)
{ // 进行加法运算
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.add(b2).doubleValue();
}
public static double sub(String d1, String d2)
{ // 进行减法运算
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.subtract(b2).doubleValue();
}
public static double sub(double d1, double d2)
{ // 进行减法运算
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.subtract(b2).doubleValue();
}
public static double mul(String d1, String d2)
{ // 进行乘法运算
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.multiply(b2).doubleValue();
}
public static double div(String d1,
String d2,int len) {// 进行除法运算
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = new BigDecimal(d2);
return b1.divide(b2,len,BigDecimal.
ROUND_HALF_UP).doubleValue();
}
/*==================================================================================*/
/*
* 将字符串数字或者浮点类型进行四舍五入保留num位小数点
*
* roundString("450359962737049688.136",2)
* 输出:
* 450359962737049688.14
*
* roundString(450359962737049688d.136,2)
* 输出:
* 450359962737049664.00 //因为double 位数16才能不丢失精度
*
* */
public static String roundString(String d, int len) { // 进行四舍五入
BigDecimal b1 = new BigDecimal(d);
BigDecimal b2 = new BigDecimal(1);
// 任何一个数字除以1都是原数字
// ROUND_HALF_UP是BigDecimal的一个常量,
return b1.divide(b2, len,BigDecimal.
ROUND_HALF_UP).toString();
}
public static String roundString(double d, int len) { // 进行四舍五入
BigDecimal b1 = new BigDecimal(d);
BigDecimal b2 = new BigDecimal(1);
// 任何一个数字除以1都是原数字
// ROUND_HALF_UP是BigDecimal的一个常量,
return b1.divide(b2, len,BigDecimal.
ROUND_HALF_UP).toString();
}
/*
* 转为double如果数字太长会显示5.996273714E7,所以看情况要不要在进行字符串数字的转换
*
* */
public static double roundDouble(String d, int len) { // 进行四舍五入
BigDecimal b1 = new BigDecimal(d);
BigDecimal b2 = new BigDecimal(1);
// 任何一个数字除以1都是原数字
// ROUND_HALF_UP是BigDecimal的一个常量,
return b1.divide(b2, len,BigDecimal.
ROUND_HALF_UP).doubleValue();
}
public static double roundDouble(double d, int len) { // 进行四舍五入
BigDecimal b1 = new BigDecimal(d);
BigDecimal b2 = new BigDecimal(1);
// 任何一个数字除以1都是原数字
// ROUND_HALF_UP是BigDecimal的一个常量,
return b1.divide(b2, len,BigDecimal.
ROUND_HALF_UP).doubleValue();
}
/*==================================================================================*/
/**
* 将小数四舍五入保留num位小数点,不能传入String
*
* double可以16位数不会丢失精度,多了就失精度
* float可以8位数不会丢失精度,多了就失精度
*
*/
public static String formatDoubleData( double f) {
DecimalFormat decimalFormat = new DecimalFormat("0.000");//构造方法的字符格式这里如果小数不足2位,会以0补足.
String p = decimalFormat.format(f);
return p;
}
public static String formatDoubleData( float f) {
DecimalFormat decimalFormat = new DecimalFormat("0.000");//构造方法的字符格式这里如果小数不足2位,会以0补足.
String p = decimalFormat.format(f);
return p;
}
/*==================================================================================*/
/*
* 把浮点型转成了String类型
* formatDoubleData2(0.00112d)
* 输出
* 0.0011199999999999999018840401987517907400615513324737548828125
*
* */
public static String formatDoubleData2( double f) {
BigDecimal decimalFormat = new BigDecimal(f);
return decimalFormat.toString();
}
/*================================*/
/**
* 保留double类型小数后两位,不四舍五入,直接取小数后两位 比如:10.1269 返回:10.12
*
* 先把数值转化成有四个小数点的数值,然后判断小数点的位置,然后截取到小数点后两位
*/
public static String formatDouble(double doubleValue) {
// 保留4位小数
DecimalFormat df = new DecimalFormat("#.0000");
String result = df.format(doubleValue);
// 截取第一位
String index = result.substring(0, 1);
if (".".equals(index)) {
result = "0" + result;
}
// 获取小数 . 号第一次出现的位置
// int inde = firstIndexOf(result, ".");
int inde = result.indexOf(".");
// 字符串截断,截取到只剩下两位数
return result.substring(0, inde + 3);
}
/**
* 查找字符串pattern在str中第一次出现的位置
*/
public static int firstIndexOf(String str, String pattern) {
for (int i = 0; i < (str.length() - pattern.length()); i++) {
int j = 0;
while (j < pattern.length()) {
if (str.charAt(i + j) != pattern.charAt(j))
break;
j++;
}
if (j == pattern.length())
return i;
}
return -1;
}
}