zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    mongo admin 客户端管理工具安装
    kong API gateway
    安装 docker管理 工具 页面 portainer
    elcipse 安装lombok插件解决 @Slf4j 等找不到log变量问题
    cqrs案例
    你还不知道这四点Mysql调优的话,那就赶快学起来
    python中的类型提示(type hint)
    大厂面试最常被问的Redis问题合集
    nginx gzip json [2]
    nginx gzip json 配置「1」
  • 原文地址:https://www.cnblogs.com/li33/p/12697476.html
Copyright © 2011-2022 走看看