Java 基础数据类型与运算

数据类型

Java 基础数据类型有 8 种,分别是 byte, short, int, long, float, double, char, boolean.
前 4 种是整型,接下去 2 种是浮点型,最后是一个字符型,一个布尔型。

整型

byte 占有 1 字节空间,数值范围用十进制表示的话是(-128~127)
short 占有 2 字节空间,数值范围以此类推就是(-32768~32767)
int 占有 4 字节空间,数值范围以此类推就是(-2147483648~2147483647)
long 占有 8 字节空间,数值范围以此类推就是(-9223372036854775808~9223372036855807)
在实际项目中对整型变量定义类型时,一般 int 型是够用的(最大值是亿级别),例如用户ID,类目ID 等,但对于订单ID,设备ID等数据就需要考虑用 long 型(最大值是千万亿级别)。如果对空间要求比较高的,那就在细细斟酌一下,不过最好能留出一倍或以上的控件,避免以后数据增长到临界值。

浮点型

float 占有 4 字节空间。
double 占有 8 字节空间。
参考文章:java基础之面试篇三—int,float,long,double取值范围,内存泄露
对于浮点型数值没法直接做大小比较,因为浮点型数值会存在精度丢失问题,原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确表示分数1/10类似这样的值(摘自 Java 核心技术卷一基础知识),所以比较前必须明确精度,例如金额比较精确到分。

字符型

char 占有 2 字节空间,以 ’ ’ 包围内容,注意和字符串" " 进行区分,char 型可以表示一个十六进制数值。

布尔型

boolean true 或者 false,用作逻辑判断。关于 boolean 占用多少空间,可以参考JAVA-基础-boolean数据类型详解

类型转换

图片来自Java核心技术卷I
为何 int 转 float 会存在精度丢失的可能,下面文章从原理上进行了分析
Java中float/double取值范围与精度
理解int转float为何会可能精度丢失的问题
简单来说,float 需要存储小数位,虽和 int 一样是 4 个字节,但因为小数位占用了一部分,自然 int 在转 float 的时候会存在精度丢失的可能,这也就好理解 long 转 double 也会存在精度丢失的可能。

算术运算

加+减-乘*除/操作是最常规的算术运算,相同类型运算结果依然是该类型,不同类型间的运算就会涉及到自动转型,可以参照上图。

除法
除法 / 表示取整,除法 % 表示取余。在结合实际业务做运算时,要注意除数为 0 的情况,不管是整数除 0 (抛异常)还是浮点数除 0 (无穷大或 NaN)恐怕都不是我们想要的,所以涉及到除法运算的,要格外考虑异常情况,通常我会选择做业务上的规避,例如提示异常或者禁止除数为 0 的情况。

++a 和 a++ 的区别
自增运算的优先级仅次于括号级别。对于 ++a 就会现做自增,之后再参与其他运算;对于 a++ 就会先参与其他运算,之后再将 a 自增。- -a 和 a- - 也是一样的道理。

大数值
一般情况是不会使用大数值表示的,上述的基本类型已经够用了,我们比较熟悉的是 BigDecimal 通常用途是用来做浮点数运算确保精度。
另外一个 BigInteger 用于整数运算,确保精度。

金额相关的基本运算

金额大小比较

/**
 * return 1 表示 v1 > v2
 * return 0 表示 v1 == v2
 * return -1 表示 v1 < v2
 */
public static int moneyCompare(double v1, double v2) {
	DecimalFormat df = new DecimalFormat("#.00");
	BigDecimal bv1 = new BigDecimal(df.format(v1));
	BigDecimal bv2 = new BigDecimal(df.format(v2));
	return bv1.compareTo(bv2);
}

金额精度化

public static double moneyFormat(double v) {
	BigDecimal bv = new BigDecimal(Double.toString(v));
	return bv.setScale(3, BigDecimal.ROUND_DOWN)
	.setScale(2, BigDecimal.ROUND_UP).doubleValue();
}

金额做差

public static double moneySub(String v1, String v2) {
	try {
		BigDecimal bv1 = new BigDecimal(v1);
		BigDecimal bv2 = new BigDecimal(v2);
		return moneyFormat(bv1.subtract(bv2).doubleValue());
	} catch (Exception e) {
		return 0.00;
	}
}

金额求和

public static double moneySum(String v1, String v2) {
	try {
		BigDecimal bv1 = new BigDecimal(v1);
		BigDecimal bv2 = new BigDecimal(v2);
		return moneyFormat(bv1.add(bv2).doubleValue());
	} catch (Exception e) {
		return 0.00;
	}
}

金额乘法

//金额乘法使用的场景一般是数量 * 金额
public static double moneyMulti(String v1, String v2) {
	try {
		BigDecimal bv1 = new BigDecimal(v1);
		BigDecimal bv2 = new BigDecimal(v2);
		return moneyFormat(bv1.multiply(bv2).doubleValue());
	} catch (Exception e) {
		return 0.00;
	}
}

金额除法

//金额除法使用的场景也一般用于 金额 / 数量
public static double moneyDiv(String v1, String v2) {
	try {
		BigDecimal bv1 = new BigDecimal(v1);
		BigDecimal bv2 = new BigDecimal(v2);
		return moneyFormat(bv1.divide(bv2, 2, BigDecimal.ROUND_UP).doubleValue());
	} catch (Exception e) {
		return 0.00;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值