11、float、double、BigDecimal的区别

    11、float、double、BigDecimal的区别

        (1)、单精度浮点数(float)与双精度浮点数(double)的区别

            ①、在内存中占有的字节数不同

                单精度浮点数在机内占4个字节

                双精度浮点数在机内占8个字节

            ②、有效数字位数不同

                单精度浮点数有效数字8位,第7位将产生四舍五入

                双精度浮点数有效数字16位,第15位将产生四舍五入

                注:将double转化成float会提示不能转化,这成为窄型转化

            ③、所能表示数的范围不同

                单精度浮点的表示范围:-3.40E+38 ~ +3.40E+38(10的-38次方到10的38次方)

                双精度浮点的表示范围:-1.79E+308 ~ +1.79E+308(10的-308次方到10的308次方)

            ④、在程序中处理速度不同

                一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快

            ⑤、如下代码执行结果:

double num1 = 0.02;

double num2 = 0.03;

double num3 = num2 - num1;

System.out.println(num3);

            输出结果不是0.01,而是0.009999999999999998。

            因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中, 往往难以确定. 常见的问题是定义了一个浮点数, 经过一系列的计算, 它本来应该等于某个确定值, 但实际上并不是。double相减会转换成二进制,因double有效位数为16位这就会出现存储小数位数不够的情况,这种情况下就会出现误差,解决方法就是使用BigDecimal,它的有效长度足够长可存储小数位数因此可代替double来进行加减乘除, 金额必须是完全精确的计算, 故不能使用double或者float, 而应该采用java.math.BigDecimal。

        (2)、Integer为对象判断是否相等还是使用equals最靠谱,int为基本类型,判断是否相等就是可以使用==。因为cache中已有-128到127,不在这范围的会新new,这时可以理解比较是内存地址,也就是比较是不是同一对象。所以说当Integer的值不在-128到127的时候使用==方法判断是否相等就会出错,在这个范围之内的就会没有问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值