zoukankan      html  css  js  c++  java
  • Char、float、Double、BigDecimal

    Char初识

    char:

    • char类型是一个单一的 16 位 Unicode 字符
    • char 在java中是2个字节(“字节”是byte,“位”是bit ,1 byte = 8 bit )
    • 最小值是 u0000(即为0)
    • 最大值是 uffff(即为65,535)
    • char 数据类型可以储存任何字符
    • 例子:char letter = 'A'
      char是Java中的保留字,与别的语言不同的是,char在Java中是16位的,因为Java用的是Unicode。不过8位的ASCII码包含在Unicode中,是从0~127的。
      Java中使用Unicode的原因是,Java的Applet允许全世界范围内运行,那它就需要一种可以表述人类所有语言的字符编码。Unicode。但是English,Spanish,German, French根本不需要这么表示,所以它们其实采用ASCII码会更高效。这中间就存在一个权衡问题。
      因为char是16位的,采取的Unicode的编码方式,所以char就有以下的初始化方式:
      char c='c'; //字符,可以是汉字,因为是Unicode编码
      char c=十进制数,八进制数,十六进制数等等; //可以用整数赋值
      char c='u数字'; //用字符的编码值来初始化,如:char='',表示结束符,它的ascll码是0, 这句话的意思和 char c=0 是一个意思。

    Char和String的转换

    String转换为char

    1. 使用String.charAt(index)(返回值为char)可以得到String中某一指定位置的char。
    2. 使用String.toCharArray()(返回值为char[])可以得到将包含整个String的char数组。这样我们就能够使用从0开始的位置索引来访问string中的任意位置的元素。

    char转换为String

    将char转换为String大致有6种方法。总结如下:

    1. String s = String.valueOf('c'); //效率最高的方法
    2. String s = String.valueOf(new char[]{'c'}); //将一个char数组转换成String
    3. String s = Character.toString('c');
    // Character.toString(char)方法实际上直接返回String.valueOf(char)
    4. String s = new Character('c').toString();
    5. String s = "" + 'c';
    // 虽然这个方法很简单,但这是效率最低的方法
    // Java中的String Object的值实际上是不可变的,是一个final的变量。
    // 所以我们每次对String做出任何改变,都是初始化了一个全新的String Object并将原来的变量指向了这个新String。
    // 而Java对使用+运算符处理String相加进行了方法重载。
    // 字符串直接相加连接实际上调用了如下方法:
    // new StringBuilder().append("").append('c').toString();
    6. String s = new String(new char[]{'c'});
    

    Java中,Float和Double数据额类型的地位

    		一直疑惑,Float和Double既然有丢失精度的潜力,为什么java还留着
    

    Float : 单精度浮点数

    Double : 双精度浮点数

    两者的主要区别如下:

      01.在内存中占有的字节数不同

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

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

      02.有效数字位数不同

        单精度浮点数有效数字8位

        双精度浮点数有效数字16位

      03.数值取值范围

        单精度浮点数的表示范围:-3.40E+38~3.40E+38

        双精度浮点数的表示范围:-1.79E+308~-1.79E+308

      04.在程序中处理速度不同

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

    如果不声明,默认小数为double类型,所以如果要用float的话,必须进行强转

      例如:float a=1.3; 会编译报错,正确的写法 float a = (float)1.3;或者float a = 1.3f;(f或F都可以不区分大小写)

    注意:float是8位有效数字,第7位数字将会四舍五入

    面试题:

      1.java中3*0.1==0.3将会返回什么?true还是false?

       fale,因为浮点数不能完全精确的表示出来,一般会损失精度。

      2.java中float f = 3.4;是否正确?

       不正确,3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型会造  成精度损失,因此需要强制类型转换float f = (float)3.4;或者写成 float f = 3.4f;才可以。

    在《Effective Java》这本书中也提到这个原则: Float和Double只能用来做科学计算或者是工程计算; 在商业计算中我们要用java.math.BigDecimal
    
    BigDecimal构造方法
    
    • public BigDecimal(double val) 将double表示形式转换为BigDecimal *不建议使用
    • public BigDecimal(int val)  将int表示形式转换成BigDecimal
    • public BigDecimal(String val)  将String表示形式转换成BigDecimal

    为什么不建议采用第一种构造方法呢?来看例子

    public static void main(String[] args){
            BigDecimal bigDecimal = new BigDecimal(2);
            BigDecimal bDouble = new BigDecimal(2.3);
            BigDecimal bString = new BigDecimal("2.3");
            System.out.println("bigDecimal=" + bigDecimal);
            System.out.println("bDouble=" + bDouble);
            System.out.println("bString=" + bString);
    }
    /**
    输出:bigDecimal=2
    	 bDouble=2.299999999999999
    	 bString==2.3
    */
    /**
    为什么会出现这种情况呢?
     JDK的描述:
     	1、参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
    	2、另一方面,String 构造方法是完全可预知的:写入 newBigDecimal("0.1") 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法。
    */
    

    通常建议BigDecimal优先使用String构造方法

  • 相关阅读:
    pycharm 代码块缩进、左移
    os.popen(cmd) .read() 获取执行后的结果且带有换行符
    数据分析基础路线了解
    Jupyter中python3之numpy练习
    Mysql数据库操作命令行小结
    Mysql配置主从同步的基本步骤
    百度翻译爬虫-Web版(自动生成sign)
    windows中的常用Dos命令
    Cookie安全隐患DOM演示
    bash漏洞技术层面分析(cgi-bin)
  • 原文地址:https://www.cnblogs.com/wzk1992/p/9078220.html
Copyright © 2011-2022 走看看