与整型数据不同,浮点数是采用“符号位+指数+有效位(尾数)”的存储方式,介于这种存储的特殊性,所以只占4字节的float类型数据却可以比占了8字节的long类型数据有着更大的取值范围。然而,这也是要付出一定的代价的,具体情况如下。
1.浮点数只是近似的存储
浮点数的缺陷1
public class FloatTest1 {
public static void main(String[] args) {
int intMax=Integer.MAX_VALUE;
int intMin=Integer.MIN_VALUE;
long longMax=Long.MAX_VALUE;
long longMin=Long.MIN_VALUE;
float fintMax=intMax;
float fintMin=intMin;
double dlongMax=longMax;
double dlongMin=longMin;
System.out.println(“int类型的最大值是:”+intMax);
System.out.println(“使用float存储后为:”+fintMax);
System.out.println(“int类型的最小值是:”+intMin);
System.out.println(“使用float存储后为:”+fintMin);
System.out.println(“long类型的最大值是:”+longMax);
System.out.println(“使用float存储后为:”+dlongMax);
System.out.println(“long类型的最小值是:”+longMin);
System.out.println(“使用float存储后为:”+dlongMin);
}
}
运行结果如下:
int类型的最大值是:2147483647
使用float存储后为:2.14748365E9
int类型的最小值是:-2147483648
使用float存储后为:-2.14748365E9
long类型的最大值是:9223372036854775807
使用float存储后为:9.223372036854776E18
long类型的最小值是:-9223372036854775808
使用float存储后为:-9.223372036854776E18
从结果为我们得知,无论是使用float类型的变量来存储数值,还是用doubel类型的变量来存储数值,都损失了一定的精度,在使用浮点数来输出时,都未能输出准确的结果。
浮点数的缺陷2
我们再来测试一下涌浮点数来存储较小的数据。
public class FloatTest2 {
public static void main(String[] args) {
for(float f=0.1f;f<1;f+=0.1){
System.out.println(f);
}
for(double d=0.1f;d<1;d+=0.1){
System.out.println(d);
}
}
}
运行结果如下:
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001
0.10000000149011612
0.20000000149011612
0.30000000149011613
0.40000000149011616
0.5000000014901161
0.6000000014901161
0.7000000014901161
0.8000000014901161
0.900000001490116
从结果可知,虽然在计算的时候每次递增0.1,然而结果却是如此的不尽人意。从两个例子可以得出:不论是存储达的数值,还是小的数值,浮点数都不是十分的
准确。浮点数在计算机中只是近似的存储,类似于1/3这样的无限小数,用浮点数也不能准确地表示出来。这里需要注意的是,在第二个例子中,我们看到
0.1~0.6的输出结果是正确的,而从0.7开始才出现误差。其实是我们的眼睛受骗了。
在执行float
f=0.1f时,计算机中的数据并不是纯粹的0.1,而是类似于0.1000~000xxx的形式,其中000~000表示若干个0,xxx表示若干个数
字,假设其数据为0.1000000000111111,而folat类型只能保留7~8位有效数字,这样就会从中间截断,从而float存储的值成为
0.10000000,即浮点数值0.1。
2.浮点数的大小比较
public class FloatTest3 {
public static void main(String[] args) {
double d1=0.1;
double d2=0.2;
double d3=d1+d2;
if(d1+d2==0.3){
System.out.println(“d1+d2==0.3″);
}else{
System.out.println(“d1+d2!=0.3″);
System.out.println(d3);
}
}
}
结果如下:
d1+d2!=0.3
0.30000000000000004
再次说明,浮点数的存储是有一定的误差的,所以,不要用浮点数进行相等的比较,也不要进行混合比较(如int与float的比较)。
3.数量级相差很大时浮点数的运算
在使用浮点数时,还需要注意一点,那就是不要再数量级相差太大的数之间进行加减运算,这样可能无法改变原数量级较大的操作数。情况下例:
public class FloatTest4 {
public static void main(String[] args) {
float f1=16777216f;
float f2=f1+1;
if(f1==f2){
System.out.println(“f1等于f2″);
}else{
System.out.println(“f1不等于f2″);
}
System.out.println(“f1=”+f1);
System.out.println(“f2=”+f2);
}
}
结果如下:
f1等于f2
f1=1.6777216E7
f2=1.6777216E7
这与浮点数的内部表示有关,这里可以不必理会浮点数复杂的存储原理,只要明白浮点数毕竟只是近似的存储,而且其存储值越大时,损失的精度也越大,对其进行数量级相差较大的加减元素按就会得不到想要的结果。有什么问题或见解,欢迎来八零客团队博客
来讨论,80客团队成员随时欢迎!后续会讲解确保结果准确性的java类。
本文转载自:http://www.balingke.com/archives/737.html
分享到:
相关推荐
总的来说,这个压缩包提供了一个跨语言(C和Java)的浮点数运算库,包含了一些基础的数学运算实现,如CORDIC算法和三角函数,并提供了测试和构建工具。开发者可以利用这些源代码了解浮点数运算的底层原理,或者在...
在Java编程语言中,浮点数类型包括`float`和`double`,它们分别用于存储单精度和双精度浮点数。了解如何在源码级别获取这两种类型的最大和最小值对于编写高效且精确的代码至关重要。本文将深入探讨Java中获取浮点数...
北京动力节点-Java编程零基础教程-058-Java基本语法-数据类型-浮点数不是精确存储的.avi 北京动力节点-Java编程零基础教程-059-Java基本语法-数据类型-float与double的区别.avi 北京动力节点-Java编程零基础教程-...
Java基础练习代码入门题训练 本资源旨在帮助初学Java的小伙伴练习Java的基础语法,涵盖了多种Java基础概念和语法结构,包括变量声明、数据类型、运算符、控制流语句等。 变量声明和数据类型 在Java中,变量声明...
毕向东java基础总结(完整版) 本资源为毕向东老师的java基础总结,涵盖了java的基础知识点,从零开始学习java的自学笔记。本文档对java的基础知识进行了系统的总结,包括java的概述、java语法基础、变量、数据类型...
"java基础语法" Java是一种广泛应用于Android开发、Web开发、企业软件开发等领域的编程语言。本文将从Java的起源、特点、文件说明、语法等方面对Java基础语法进行详细介绍。 Java的起源 Java语言的前身是Oak语言...
马克思手稿中有一道趣味数学问题是Java基础编程题中的一道题目,它考察了程序员对数学运算和逻辑思维的理解。通过解决马克思手稿中的一道趣味数学问题,我们可以了解Java中的数学运算和逻辑思维等。 7. 正的九九...
标题中提及的“Java基础之Java编程基础”表明,我们要探讨的是一些关于Java编程的初级知识点。Java作为一种广泛使用的编程语言,其基础语法是任何学习Java的开发者都必须掌握的。 描述部分指出,本节内容将围绕Java...
- 浮点数运算可能会存在精度误差,因此在进行比较操作时需要注意这一点。 **字符串注意**: - 当使用`new String()`创建字符串时,即使内容相同,也会创建不同的对象。 - 直接赋值的字符串会存储在常量池中,相同的...
需要注意的是,浮点数运算可能会有精度损失,因为计算机无法精确表示所有十进制小数。 在实现这个计算器时,程序设计的基本结构会包括输入解析、运算逻辑和结果输出三个主要部分。输入解析通常会涉及字符串的处理,...
例如,可以创建一个接受两个`Number`对象(可能是`Integer`、`Double`或其他子类)的`calculate`方法,这样就允许进行浮点数运算: ```java public interface NumberOperation { Number calculate(Number a, ...
【Java基础】 Java是一种广泛使用的面向对象的编程语言,其设计目标是具有良好的可移植性、健壮性以及高效性。在Java中,对象关系映射(ORM)技术是解决程序中的对象模型与数据库的关系模型不匹配问题的关键。ORM...
### Java基础复习知识点详解 #### 开发中的注意事项 在Java编程初期,经常会出现一些常见的错误,比如找不到文件、单词拼写错误、括号不匹配以及中英文混淆等问题。这些问题虽然简单,但却是初学者最易犯的错误。 ...
根据提供的文件信息,这里将对其中的笔试题目进行解析,并解释相关的Java基础知识。 ### 题目解析 #### 1. 字符串缓冲区的使用 **题目**: 分析下面的Java程序段,编译运行后的输出结果是()。 ```java public ...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、健壮性和...这个教程71.069.JAVA基础教程_Java基本语法-复习3:变量的运算规则(71)将深入探讨这些概念,帮助初学者巩固基础,为更复杂的编程任务打下坚实的基础。
### Java基本数据与运算知识点详解 #### 2.1 数据类型及变量应用 在Java中,数据类型可以分为两大类:基本数据类型和引用数据类型。本章节主要讲解了基本数据类型的使用方法。 ##### 基本数据类型 基本数据类型...
### Java基础语法知识点详解 #### 一、Java数据类型 Java是一种强类型语言,每种变量都需要明确指定其类型。Java的基本数据类型分为以下几类: 1. **整数类型**: - `byte`:2个字节,取值范围-128到127。 - `...
Java 基础语法作业 以下是根据给定的文件内容生成的知识点: 1. 大整数相加: * Java 中的数据类型:整数类型(int、long)、字符串类型(String) * 字符串操作:使用 `+` 运算符将字符串连接起来 * 输入输出:...