Java 数据类型转换的骚操作和神奇现象

问:银行用什么数据类型来表示余额?float还是double?

都不是!!下面说明为什么都不可以呢?

public static void main(String[] args) {
        //浮点数他都是近似的,你看着一样的东西,他看来就不一样
        float f_a = 0.1f;
        double d_a = 0.1;
        System.out.println("两个0.1的比较:"+(f_a==d_a));
        float f_b =2213231213f;
        float f_c =f_b + 1;
        System.out.println("很大的float+1:"+(f_b == f_c));
        double d_b =2213231213f;
        double d_c =d_b + 1;
        System.out.println("很大的double+1:"+(d_b == d_c));
    }

 

 

float+1竟然还等于float,那也就是说   :王健林=马云

浮点数存在精度损失,不能应用在金融领域不允许舍去的环境下。

浮点数损失进度的原理:https://www.iteye.com/blog/xinklabi-2344952

所以金融领域用的是BigDecimal。

解决这个问题的方法是BigDecimal的类,这个类可以表示任意精度的数字

其原理是:用字符串存储数字,将其转换为数组来模拟大数,实现两个数组的数学运算,并将结果返回。

BigDecimal num12 = new BigDecimal("0.005");//用字符串转换成大数,无误差

 

强制类型转换 :以左为尊,左大右小,右边要服从左边自动转换

自动类型转化 :以左为尊,左小右大,右边要服从左边强制转换,高转换低可能会存在内存溢出,或者精度丢失。

//从低到高  byte->char,short->int->long->float->double
byte
b = 12; int i = b;//左边大右边自动转换成左边的int int a = 1000; b = a;//左边小,右边直接这样转换会报错 b =(byte) a;强制类型转换,这样就可以了,但是这样有可能会溢出

JDK7新特性,数字间可以用下划线,方便人们阅读:

int a = 1_0000_0000;//还是和正常的数字一样
int b = 200;
long c = a*b;//这样会内存溢出,因为a*b的结果还是个long类型。
long d = (long)a*b;//long*int的结果还是long System.out.println(a);

 

posted @ 2020-04-14 13:39  li33的博客  阅读(162)  评论(0编辑  收藏  举报