ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

动手动脑问题分析

2019-09-18 16:57:11  阅读:176  来源: 互联网

标签:分析 动脑 System 动手 枚举 println 100 out Size


一、仔细阅读示例: EnumTest.java,运行它,分析运行结果?代码如下

package test;

public class EnumTest {

 

public static void main(String[] args) {

Size s=Size.SMALL;

Size t=Size.LARGE;

//s和t引用同一个对象?

System.out.println(s==t);  //

//是原始数据类型吗?

System.out.println(s.getClass().isPrimitive());

//从字符串中转换

Size u=Size.valueOf("SMALL");

System.out.println(s==u);  //true

//列出它的所有值

for(Size value:Size.values()){

System.out.println(value);

}

}

 

}

 enum Size{SMALL,MEDIUM,LARGE};

运行结果如下:

false

false

true

SMALL

MEDIUM

LARGE

分析:1、对象s,t都是将字符串转化为枚举但是因为字符串不同所以s和t不相等输出false。

2、getClass()函数作用是获取对象的类型类,isPrimitive()是getClass()中的方法作用是判断该类型是否是基本类型,枚举不是基本类型故输出false。

3、Valueof()函数是将字符串转换为其他类型,在此程序中将”SMALL”转换为枚举,故s与u相等输出true

4、Values()函数是将枚举中的常量遍历,通过for循环输出。

你能得到什么结论?你掌握了枚举类型的基本用法了吗?

结论:枚举不是基本类型,对于声明为 enum 的类型,编译器会自动生成 一个继承 java.lang.Enum 的类,并且生成 valueOf 和 values() 方法。

掌握了两种将字符串转换为枚举的方法

1.Size s=Size.SMALL;

2.Size u=Size.valueOf("SMALL");

还有遍历枚举常量并输出的方法。

二、动手实验代码如下

public class TestDouble {

 

    public static void main(String args[]) {

        System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));

        System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));

        System.out.println("4.015 * 100 = " + (4.015 * 100));

        System.out.println("123.3 / 100 = " + (123.3 / 100));

    }

}

运行结果:

0.05 + 0.01 = 0.060000000000000005

1.0 - 0.42 = 0.5800000000000001

4.015 * 100 = 401.49999999999994

123.3 / 100 = 1.2329999999999999

结论:使用double类型的数值进行计算,其结果是不精确的。

原因:这个涉及到二进制与十进制的转换问题。
N进制可以理解为:数值×基数的幂,例如我们熟悉的十进制数123.4=1×10²+2×10+3×(10的0次幂)+4×(10的-1次幂);其它进制的也是同理,例如二进制数11.01=1×2+1×(2的0次幂)+0+1×(2的-2次幂)=十进制的3.25。
double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。

举个例子来说,比如要用4bit来表示小数3.26,从高到低位依次对应2的1,0,-1,-2次幂,根据最上面的分析,应当在二进制数11.01(对应十进制的3.25)和11.10(对应十进制的3.5)之间选择。
简单来说就是我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。

解决方法:使用BigDecimal类

三、以下代码的输出结果是什么?

int X=100;

int Y=200;

System.out.println("X+Y="+X+Y);

System.out.println(X+Y+"=X+Y");

运行结果:

X+Y=100200

300=X+Y

出现此结果的原因:System.out.println()函数中的非字符串+有两个作用,分别是字符连接和数据运算。而要是数据运算必须加括号(在开头可省略括号),其他情况就是字符串连接。

题目中第一个是起连接作用而第二个是运算。

标签:分析,动脑,System,动手,枚举,println,100,out,Size
来源: https://www.cnblogs.com/chenaiiu/p/11543517.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有