首页 > 编程语言 >Java动手动脑及课后实验

Java动手动脑及课后实验

时间:2024-09-26 18:34:05浏览次数:1  
标签:0.01 Java BigDecimal 动脑 System 0.05 课后 println out

一、
仔细阅读示例: EnumTest.java,运行它,分析运行结果?
你能得到什么结论?你掌握了枚举类型的基本用法了吗?

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
第一个输出为false,说明s和t值不同,不引用同一对象;
第二个输出为false,说明枚举类型不是原始数据类型;
第三个输出为true,说明s为字符串类型;
打印枚举变量的所有值,有三个输出,说明枚举变量是引用类型,每个具体值都引用一个特定的对象。

二、
动手动脑:看着这个图,再查查Java中每个数据类型所占的位数,和表示数值的范围,你能得出什么结论?
数据类型的转换从小范围到大范围无精度损失;
浮点型的存储格式与整形不同,转换时会有精度损失;

三、
请运行以下代码(TestDouble.java)

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类型的数值进行运算得不到“数学上精确”的结果?
请通过互联网查找资料,或者是阅读相关计算机教材,解决这个问题。
提示:
这个问题,与浮点数在计算机内部的表示方法有关系。可以使用这个知识在搜索引擎中查找相关资料
计算机中,浮点数由符号位、指数部分和尾数部分组成,这种表示方式使浮点数能够表示更大的数值范围,但同时引入了精度问题;
计算机使用二进制表示浮点数,在进行运算时,由于无法精确的表示某些十进制小数,会导致计算结果存在误差。

四、
解决方法——使用BigDecimal类
Demo:TestBigDecimal.java

import java.math.BigDecimal;

public class TestBigDecimal
{
public static void main(String[] args)
{
BigDecimal f1 = new BigDecimal("0.05");
BigDecimal f2 = BigDecimal.valueOf(0.01);
BigDecimal f3 = new BigDecimal(0.05);
System.out.println("下面使用String作为BigDecimal构造器参数的计算结果:");
System.out.println("0.05 + 0.01 = " + f1.add(f2));
System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
System.out.println("0.05 / 0.01 = " + f1.divide(f2));
System.out.println("下面使用double作为BigDecimal构造器参数的计算结果:");
System.out.println("0.05 + 0.01 = " + f3.add(f2));
System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
System.out.println("0.05 / 0.01 = " + f3.divide(f2));
}
}
下面使用String作为BigDecimal构造器参数的计算结果:
0.05 + 0.01 = 0.06
0.05 - 0.01 = 0.04
0.05 * 0.01 = 0.0005
0.05 / 0.01 = 5
下面使用double作为BigDecimal构造器参数的计算结果:
0.05 + 0.01 = 0.06000000000000000277555756156289135105907917022705078125
0.05 - 0.01 = 0.04000000000000000277555756156289135105907917022705078125
0.05 * 0.01 = 0.0005000000000000000277555756156289135105907917022705078125
0.05 / 0.01 = 5.000000000000000277555756156289135105907917022705078125
注意:在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题。(为什么会这样呢?)
使用double类型和使用String类型时调用的构造函数不同,根据double创建的对象会由于double类型本身的精度问题导致对象包含不精确的值;而字符串中每个数都是确定的,可以避免因二进制表示限制而产生误差。

五、
以下代码的输出结果是什么?
int X=100;
int Y=200;
System.out.println("X+Y="+X+Y);
System.out.println(X+Y+"=X+Y");
为什么会有这样的输出结果?
X+Y=100100
200=X+Y
第一个输出执行了字符串连接操作将“X+Y=”和“X”“Y”三个字面量连接并打印;
第二个输出将X和Y的值相加再连接和打印;

标签:0.01,Java,BigDecimal,动脑,System,0.05,课后,println,out
From: https://www.cnblogs.com/zhanglijian/p/18434053

相关文章

  • 使用java做一个微信机器人
    Java实现微信小号做机器人随着人工智能技术的发展,机器人在各行各业扮演着越来越重要的角色。在社交领域,微信机器人也逐渐受到人们的关注。本文将介绍如何使用Java实现一个简单的微信小号做机器人的功能。请求参数Header参数exportinterfaceApifoxModel{"X-GEWE-TOKEN":st......
  • 庖丁解java(一篇文章学java)
    (大家不用收藏这篇文章,因为这篇文章会经常更新,也就是删除后重发) 一篇文章学java,这是我滴一个执念...当然,真一篇文章就写完java基础,java架构,java业务实现,java业务扩展,根本不可能.所以,这篇文章,就是一个索引,索什么呢?   请看下文.关于决定开始写博文的介绍......
  • AI改写行业,Java成就精彩,AI+Java新的编程形式越能体现基础重要性
    我作为一名资深的Java工程师,非常高兴能和大家分享我在学习和使用Java过程中的一些经验。不论人工智能(AI)如何发展,我都坚信掌握好Java的核心基础知识是非常重要的。我们都知道,Java作为一种通用编程语言,它的基础知识和编程思维在未来的技术发展中仍将发挥重要作用。很多人可能会......
  • java计算机毕业设计网上物流系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和电子商务的普及,物流行业作为连接生产与消费的关键环节,其效率与服务质量直接影响着消费者的购物体验及企业的市场竞争力。......
  • java计算机毕业设计热映电影订票系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:随着数字娱乐产业的蓬勃发展,电影已成为人们日常生活中不可或缺的文化消费方式之一。特别是在互联网时代,观众对于电影的选择与观影体验提出了更高的要......
  • JAVA 数据结构与算法 队列的介绍与应用
    一、队列队列是一个有序列表,可以用数组或者链表来实现遵循先入先出的原则。当我们将数据存入队列时称为”addQueue”,addQueue的处理需要有两个步骤:思路分析:将尾指针往后移:rear+1,当front==rear【空】若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所......
  • 如何用Java SpringBoot Vue搭建宠物店管理系统?实现高效业务流程
    ✍✍计算机毕业编程指导师**⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java、Python、小程序、大数据实战项目集⚡⚡文末获取......
  • 关于Java中的List<User>如何进行深拷贝
    联调中发现了一个很初级,但有容易被忽略的拷贝问题:错误方式:List<User>us=newArrayList<>();List<User>us1=newArrayList<>(us);此种拷贝,如果修改了集合us中的User对象,us1会跟着改变;找了网上很多方式:1.clone方式us的方法里边不存在clone;2.addAll方法不是深度......
  • 如何用Java SpringBoot构建老年人健康管理系统?三步轻松上手,选题不再难!
    ✍✍计算机毕业编程指导师**⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java、Python、小程序、大数据实战项目集⚡⚡文末获取......
  • java+vue计算机毕设本科生考勤与考核管理信息系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高校规模的不断扩大和学生人数的急剧增加,传统的人工考勤与考核方式已难以满足高效、准确的管理需求。在日常教学管理中,学生考勤、成绩管理、选课......