一、java八大基础数据类型
基本数据类型 | 大小(占内存空间) | 取值范围 | 默认值(基础数据类型) | 包装器类型 |
byte | 8bit(1字节) | -128~+127 | 0 | Byte |
short | 16bit(2字节) | -32768~32767 | 0 | Short |
int | 32bit(4字节) | -(2^31)~+(2^31)-1 | 0 | Integer |
long | 64bit(8字节) | -(2^63)~+(2^63)-1 | 0 | Long |
float | 32bit(4字节) | -(3.402823447E+38F)~+(3.402823447E+38F) | 0.0f | Float |
double | 64bit(8字节) | -(1.79769313486231570E+308) ~+(1.79769313486231570E+308) | 0.0d | Double |
char | 16bit(2字节) | 0~+(2^16)-1 | "/u0000" | Char |
boolean | 1bit(1/8字节) | 0、1 | 0 | Boolean |
注:Java中的基本数据类型全部直接全部实例化在栈(RAM区)内存中。
二、高精度数字对象
java提供了两个高精度数字对象:BigInteger(支持任意精度的整数)、BigDecimal(支持任意类型的浮点数),这两个高精度数字对象以牺牲效率来提高运算的精度。具体运算方法如下所示:
- import java.math.BigDecimal;
- public class ArithmeticUtil {
- /*
- * 小数精确的位数
- */
- private static final int DEF_DIV_SCALE = 10;
- /**
- * 提供精确的加法运算。
- *
- * @param v1
- * 被加数
- * @param v2
- * 加数
- * @return 两个参数的和
- */
- public static double add(double v1, double v2) {
- BigDecimal b1 = new BigDecimal(Double.toString(v1));
- BigDecimal b2 = new BigDecimal(Double.toString(v2));
- return b1.add(b2).doubleValue();
- }
- /**
- * 提供精确的加法运算。
- *
- * @param v1
- * 被加数
- * @param v2
- * 加数
- * @return 两个参数的和
- */
- public static BigDecimal add(String v1, String v2) {
- BigDecimal b1 = new BigDecimal(v1);
- BigDecimal b2 = new BigDecimal(v2);
- return b1.add(b2);
- }
- /**
- * 提供精确的加法运算。 String
- *
- * @param v1
- * 被加数
- * @param v2
- * 加数
- * @return 两个参数的和
- */
- public static String strAdd(String v1, String v2,int scale) {
- if (scale < 0) {
- throw new IllegalArgumentException(
- "The scale must be a positive integer or zero");
- }
- BigDecimal b1 = new BigDecimal(v1);
- BigDecimal b2 = new BigDecimal(v2);
- return b1.add(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
- }
- /**
- * 提供精确的减法运算。
- *
- * @param v1
- * 被减数
- * @param v2
- * 减数
- * @return 两个参数的差
- */
- public static double sub(double v1, double v2) {
- BigDecimal b1 = new BigDecimal(Double.toString(v1));
- BigDecimal b2 = new BigDecimal(Double.toString(v2));
- return b1.subtract(b2).doubleValue();
- }
- /**
- * 提供精确的减法运算。
- *
- * @param v1
- * 被减数
- * @param v2
- * 减数
- * @return 两个参数的差
- */
- public static BigDecimal sub(String v1, String v2) {
- BigDecimal b1 = new BigDecimal(v1);
- BigDecimal b2 = new BigDecimal(v2);
- return b1.subtract(b2);
- }
- /**
- * 对一个数字取精度
- * @param v
- * @param scale
- * @return
- */
- public static BigDecimal round(String v, int scale) {
- if (scale < 0) {
- throw new IllegalArgumentException(
- "The scale must be a positive integer or zero");
- }
- BigDecimal b = new BigDecimal(v);
- BigDecimal one = new BigDecimal("1");
- return b.divide(one, scale, BigDecimal.ROUND_HALF_UP);
- }
- /**
- * 提供精确的减法运算。String
- *
- * @param v1
- * 被减数
- * @param v2
- * 减数
- * @return 两个参数的差
- */
- public static String strSub(String v1, String v2,int scale) {
- if (scale < 0) {
- throw new IllegalArgumentException(
- "The scale must be a positive integer or zero");
- }
- BigDecimal b1 = new BigDecimal(v1);
- BigDecimal b2 = new BigDecimal(v2);
- return b1.subtract(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
- }
- /**
- * 提供精确的乘法运算。
- *
- * @param v1
- * 被乘数
- * @param v2
- * 乘数
- * @return 两个参数的积
- */
- public static double mul(double v1, double v2) {
- BigDecimal b1 = new BigDecimal(Double.toString(v1));
- BigDecimal b2 = new BigDecimal(Double.toString(v2));
- return b1.multiply(b2).doubleValue();
- }
- /**
- * 提供精确的乘法运算。
- *
- * @param v1
- * 被乘数
- * @param v2
- * 乘数
- * @return 两个参数的积
- */
- public static BigDecimal mul(String v1, String v2) {
- BigDecimal b1 = new BigDecimal(v1);
- BigDecimal b2 = new BigDecimal(v2);
- return b1.multiply(b2);
- }
- /**
- * 提供精确的乘法运算。 保留scale 位小数
- *
- * @param v1
- * 被乘数
- * @param v2
- * 乘数
- * @return 两个参数的积
- */
- public static double mul2(double v1, double v2,int scale) {
- BigDecimal b1 = new BigDecimal(Double.toString(v1));
- BigDecimal b2 = new BigDecimal(Double.toString(v2));
- return round(b1.multiply(b2).doubleValue(),scale);
- }
- /**
- * 提供精确的乘法运算。 保留scale 位小数 String
- *
- * @param v1
- * 被乘数
- * @param v2
- * 乘数
- * @return 两个参数的积
- */
- public static String strMul2(String v1, String v2,int scale) {
- if (scale < 0) {
- throw new IllegalArgumentException(
- "The scale must be a positive integer or zero");
- }
- BigDecimal b1 = new BigDecimal(v1);
- BigDecimal b2 = new BigDecimal(v2);
- return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
- }
- /**
- * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。
- *
- * @param v1
- * 被除数
- * @param v2
- * 除数
- * @return 两个参数的商
- */
- public static BigDecimal div(String v1, String v2) {
- return div(v1, v2, DEF_DIV_SCALE);
- }
- /**
- * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。
- *
- * @param v1
- * 被除数
- * @param v2
- * 除数
- * @return 两个参数的商
- */
- public static double div(double v1, double v2) {
- return div(v1, v2, DEF_DIV_SCALE);
- }
- /**
- * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。
- *
- * @param v1
- * 被除数
- * @param v2
- * 除数
- * @param scale
- * 表示需要精确到小数点以后几位。
- * @return 两个参数的商
- */
- public static double div(double v1, double v2, int scale) {
- if (scale < 0) {
- throw new IllegalArgumentException(
- "The scale must be a positive integer or zero");
- }
- BigDecimal b1 = new BigDecimal(Double.toString(v1));
- BigDecimal b2 = new BigDecimal(Double.toString(v2));
- return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
- }
- /**
- * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。
- *
- * @param v1
- * 被除数
- * @param v2
- * 除数
- * @param scale
- * 表示需要精确到小数点以后几位。
- * @return 两个参数的商
- */
- public static BigDecimal div(String v1, String v2, int scale) {
- if (scale < 0) {
- throw new IllegalArgumentException(
- "The scale must be a positive integer or zero");
- }
- BigDecimal b1 = new BigDecimal(v1);
- BigDecimal b2 = new BigDecimal(v2);
- return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);
- }
- /**
- * 精确的除法运算。除不尽时,由scale参数指 定精度 四舍五入。string
- *
- * @param v1
- * 被除数
- * @param v2
- * 除数
- * @param scale
- * 表示需要精确到小数点以后几位。
- * @return 两个参数的商
- */
- public static String strDiv(String v1, String v2, int scale) {
- if (scale < 0) {
- throw new IllegalArgumentException(
- "The scale must be a positive integer or zero");
- }
- BigDecimal b1 = new BigDecimal(v1);
- BigDecimal b2 = new BigDecimal(v2);
- return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).toString();
- }
- /**
- * 精确的除法运算。除不尽时,由scale参数指 定精度 四舍五入。string
- *
- * @param v1
- * 被除数
- * @param v2
- * 除数
- * @param scale
- * 表示需要精确到小数点以后几位。
- * @return 两个参数的商
- */
- public static BigDecimal bigDiv(String v1, String v2, int scale) {
- if (scale < 0) {
- throw new IllegalArgumentException(
- "The scale must be a positive integer or zero");
- }
- BigDecimal b1 = new BigDecimal(v1);
- BigDecimal b2 = new BigDecimal(v2);
- return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);
- }
- /**
- * 取余数 string
- * @param v1
- * @param v2
- * @param scale
- * @return
- */
- public static BigDecimal strRemainder(String v1,String v2, int scale){
- if (scale < 0) {
- throw new IllegalArgumentException(
- "The scale must be a positive integer or zero");
- }
- BigDecimal b1 = new BigDecimal(v1);
- BigDecimal b2 = new BigDecimal(v2);
- return b1.remainder(b2).setScale(scale, BigDecimal.ROUND_HALF_UP);
- }
- /**
- * 取余数 string
- * @param v1
- * @param v2
- * @param scale
- * @return string
- */
- public static String strRemainder2Str(String v1,String v2, int scale){
- if (scale < 0) {
- throw new IllegalArgumentException(
- "The scale must be a positive integer or zero");
- }
- BigDecimal b1 = new BigDecimal(v1);
- BigDecimal b2 = new BigDecimal(v2);
- return b1.remainder(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
- }
- /**
- * 比较大小 如果v1 大于v2 则 返回true 否则false
- * @param v1
- * @param v2
- * @return
- */
- public static boolean strcompareTo(String v1,String v2){
- BigDecimal b1 = new BigDecimal(v1);
- BigDecimal b2 = new BigDecimal(v2);
- int bj = b1.compareTo(b2);
- boolean res ;
- if(bj>0)
- res = true;
- else
- res = false;
- return res;
- }
- /**
- * 比较大小 如果v1 大于等于v2 则 返回true 否则false
- * @param v1
- * @param v2
- * @return
- */
- public static boolean strcompareTo2(String v1,String v2){
- BigDecimal b1 = new BigDecimal(v1);
- BigDecimal b2 = new BigDecimal(v2);
- int bj = b1.compareTo(b2);
- boolean res ;
- if(bj>=0)
- res = true;
- else
- res = false;
- return res;
- }
- /**
- * 比较大小 如果v1 等于v2 则 返回true 否则false
- * @param v1
- * @param v2
- * @return
- */
- public static boolean strcompareTo3(String v1,String v2){
- BigDecimal b1 = new BigDecimal(v1);
- BigDecimal b2 = new BigDecimal(v2);
- int bj = b1.compareTo(b2);
- boolean res ;
- if(bj==0)
- res = true;
- else
- res = false;
- return res;
- }
- /**
- * 取余数 BigDecimal
- * @param v1
- * @param v2
- * @param scale
- * @return
- */
- public static BigDecimal bigRemainder(BigDecimal v1,BigDecimal v2, int scale){
- if (scale < 0) {
- throw new IllegalArgumentException(
- "The scale must be a positive integer or zero");
- }
- return v1.remainder(v2).setScale(scale, BigDecimal.ROUND_HALF_UP);
- }
- /**
- * 提供精确的小数位四舍五入处理。
- *
- * @param v
- * 需要四舍五入的数字
- * @param scale
- * 小数点后保留几位
- * @return 四舍五入后的结果
- */
- public static double round(double v, int scale) {
- if (scale < 0) {
- throw new IllegalArgumentException(
- "The scale must be a positive integer or zero");
- }
- BigDecimal b = new BigDecimal(Double.toString(v));
- BigDecimal one = new BigDecimal("1");
- return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
- }
- /**
- * 提供精确的小数位四舍五入处理。string
- *
- * @param v
- * 需要四舍五入的数字
- * @param scale
- * 小数点后保留几位
- * @return 四舍五入后的结果
- */
- public static String strRound(String v, int scale) {
- if (scale < 0) {
- throw new IllegalArgumentException(
- "The scale must be a positive integer or zero");
- }
- BigDecimal b = new BigDecimal(v);
- return b.setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
- }
- }