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='\0',表示结束符,它的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构造方法

Char、float、Double、BigDecimal的更多相关文章

  1. HTML静态网页的格式与布局(position:(fixed、absolute、relative)、分层、float(left、right))

    一.position:fixed 锁定位置(相对于浏览器的位置),例如有些网站的右下角的弹出窗口. 示例: 二.position:absolute 1.外层没有position:absolute(或r ...

  2. Java使用BigDecimal保留double、float运算精度、保留指定位数有效数字、四舍五入

    工具类 package --; import java.math.BigDecimal; /** * Created by kongqw on 2015/12/10. */ public final ...

  3. java中表示二进制、八进制、十进制、十六进制,double、float、整型

    java里不能这样表示二进制,只能是   8,10,16进制  8:         前置   0  10:      不需前置 16:      前置   0x   或者   0X double:2 ...

  4. java中常用到的math方法(Math.PI、Math.random()、Math.abs(double)、Math.floor(double)、Math.ceil(double)、Math.round(double))

    public class MathDemo { public static void main(String args[]){ /** * abs求绝对值 */ System.out.println( ...

  5. Java中float、double、long类型变量赋值添加f、d、L尾缀问题

    展开1. 添加尾缀说明 我们知道Java在变量赋值的时候,其中float.double.long数据类型变量,需要在赋值直接量后面分别添加f或F.d或D.l或L尾缀来说明.  其中,long类型最好以 ...

  6. 第48条:如果需要精确的答案,请避免使用float和double

    float和double主要为了科学计算和工程计算而设计,执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确的结果,所以不适合用于需要精确 ...

  7. decimal, float 和double

    阿里的 Java 手册里写着: 6. [强制] 小数类型为 decimal,禁止使用 float 和 double. 说明:float 和 double 在存储的时候,存在精度损失的问题,很可能在值的 ...

  8. java.lang基础数据类型boolean、char、byte、short、int、long、float、double (JDK1.8)

    java.lang.Boolean public static int hashCode(boolean value) { return value ? 1231 : 1237; } JDK 1.8新 ...

  9. c语言基本数据类型short、int、long、char、float、double

    C 语言包含的数据类型如下图所示: 一.数据类型与“模子”short.int.long.char.float.double 这六个关键字代表C 语言里的六种基本数据类型. 怎么去理解它们呢? 举个例子 ...

随机推荐

  1. dropdownlist select的用法

    <tr>        <td></td>        <td>@Html.DropDownList("ddlSex",@Mode ...

  2. 页面的五种布局以及嵌套『Android系列八』

    转自:http://blog.csdn.net/dazlly/article/details/7860125 因为学习比较晚,我用的相关版本为SDK4.1.eclipse4.2,而自己看的教材都是低版 ...

  3. 一、什么是Velocity及简单示例

    1.velocity简介:    velocity是一个java模板引擎技术,任何人可以使用这种简单而又强有力的模板语言去获取java对象. 在使用Velocity进行web开发时,web开发人员和j ...

  4. java的基本类型和对应的封装类

    封装,是java这门语言的重要核心思想之一,封装也是对面向对象这一思想很好的体现. 在很多情况下,我们需要对数据进行一些转换,如:将一字符串"123"转换成int类型的123,或者 ...

  5. Vue.js面试题

    一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑:View 代表UI ...

  6. chart 模板【转】

    Helm 通过模板创建 Kubernetes 能够理解的 YAML 格式的资源配置文件,我们将通过例子来学习如何使用模板. 以 templates/secrets.yaml 为例: 从结构看,文件的内 ...

  7. vue 加载静态图片

    <img class="headImg" :src="require('../../assets/uploads/'+headImg)" alt=&quo ...

  8. vue+element 递归上传图片

    直接上代码. <template>   <div>     <el-upload       action="http://localhost:3000/pic ...

  9. css 让多出的文字成省略号...

    一,单行 white-space:nowrap; overflow:hidden;text-overflow: ellipsis; 二,多行 display: -webkit-box; overflo ...

  10. ubuntu14安装一些常用的软件

    1.搜狗输入法: 2.sublime 3. 搜狗输入法在Linux里面还是很正常的,并没有想在windows下那样充斥这各种广告. 在搜狗的官网下载了输入法-->双击安装-->提示存在依赖 ...