double和float的精度和取值范围
(1)取值范围
float和double的范围是由指数的位数来决定的。
float的指数位有8位,而double的指数位有11位,分布如下:
float:
1bit(符号位) |
8bits(指数位) |
23bits(尾数位) |
double:
1bit(符号位) |
11bits(指数位) |
52bits(尾数位) |
于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。其中负指数决定了浮点数所能
表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。float的范围为-2^128 ~ +2^128,
也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。
(2)精度
float和double的精确度是按照整体位数来的,并不是只是考虑小数部分。
float的精度为7~8位有效数字,7位肯定能保证,8位的值也存在。
double的精度为16~17位有效数字
看一段代码
public class Main {public static void main(String[] args) {float f6 = 1.000003f;//6位小数位,总共7位float f7 = 1.0000003f;//7位小数位,总共8位float f8 = 1.00000003f;//8位小数位,总共9位float f_8 = 10.000003f;//6位小数位,总共8位float f_9 = 10.0000003f;//7位小数位,总共9位float f_10 = 10.00000003f;//8位小数位,总共10位double d15 = 1.000000000000003;//15位小数位,总共16位double d16 = 1.0000000000000003;//16位小数位,总共17位double d17 = 1.00000000000000003;//17位小数位,总共18位double d_17 = 10.000000000000003;//15位小数位,总共17位double d_18 = 10.0000000000000003;//16位小数位,总共18位double d_19 = 10.00000000000000003;//17位小数位,总共19位System.out.println("结果为false证明 == 校验到了小数点位, 精确度可信");System.out.println("float(7位有效,6位小数) 1.000003f == 1 的结果是:" + (f6==1));System.out.println("float(8位有效,7位小数) 1.0000003f == 1 的结果是:" + (f7==1));System.out.println("float(9位有效,8位小数) 1.00000003f == 1 的结果是:" + (f8==1));System.out.println("float(8位有效,6位小数) 10.000003f == 10 的结果是:" + (f_8==10));System.out.println("float(9位有效,7位小数) 10.0000003f == 10 的结果是:" + (f_9==10));System.out.println("float(10位有效,8位小数) 10.00000003f == 10 的结果是:" + (f_10==10));System.out.println("------------------");System.out.println("double(16位有效,15位小数) 1.000000000000003 == 1 的结果是:" + (d15==1));System.out.println("double(17位有效,16位小数) 1.0000000000000003 == 1 的结果是:" + (d16==1));System.out.println("double(18位有效,17位小数) 1.00000000000000003 == 1 的结果是:" + (d17==1));System.out.println("double(17位有效,15位小数) 10.000000000000003 == 10 的结果是:" + (d_17==10));System.out.println("double(18位有效,16位小数) 10.0000000000000003 == 10 的结果是:" + (d_18==10));System.out.println("double(19位有效,17位小数) 10.00000000000000003 == 10的结果是:" + (d_19==10));}
}
结果为false的,那么小数点存在有意义,也就是精确位
从结果来看,float可以精确到有效数字8位, double到了17位
之所以不能用f1==f2来判断两个数相等,是因为虽然f1和f2在可能是两个不同的数字,但是受到浮点数表示精度的限制,有可能会错误的判断两个数相等!
double和float的精度和取值范围相关推荐
- float的精度和取值范围
文章目录 前言 精度限制 float存储方式 float存储示例 float范围 float精度 float小数 float特殊值 总结 前言 关于float的精度和取值范围这个问题,我查询了很多次, ...
- float和double的精度和取值范围计算方法
C/C++各数据类型大小和取值范围 类型名称 字节数 取值范围 signed char 1 -2^7(-128) ~ 2^7-1(127) unsigned char 1 0 ~ 2^8-1(255) ...
- double 转float 损失精度
(一)32位平台: 分为有符号型与无符号型. 有符号型: short 在内存中占两个字节,范围为-2^15~(2^15-1) int 在内存中占四个字节,范围为-2^31~(2^31-1) long在 ...
- C/C++ 各类型int、long、double、char、long long取值范围(基本类型的最大最小值)
做题的时候经常会使用到数据类型的最大最小值(如int, long, long long, char等),我也查了很多次,这次就记下来当笔记吧. 参考了C++ prime plus.各个博客.教程和c+ ...
- double和float计算精度不准的问题
2019独角兽企业重金招聘Python工程师标准>>> 1.首先我们要知道float和double型,的底层实现是二进制的.十进制中的一个有限位数小数,转换成二进制就不一定是有限位数 ...
- float为什么要比Long的取值范围大
要知道为什么占32bit的float类型却比占64bit的Long类型的取值范围还要大,就要先了解float的存储结构. float的存储结构 符号位(1bit) 指数(8bit) 尾数(23bit) ...
- Double 与 Float 的值的比較结果
首先看geeksforgeeks上的两个程序: 程序1: #include<stdio.h> int main() {float x = 0.1;if (x == 0.1)printf(& ...
- double取值范围 java_Java中float/double取值范围与精度
Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个 ...
- float 范围 java_Java中float/double取值范围与精度
Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个 ...
最新文章
- Java学习总结:8
- PHP邮件队列,php群发邮件,用数据库做邮件队列
- Android源码解析(一)动画篇-- Animator属性动画系统
- 听说你想去大厂看学姐,带你看看拼多多运营面经
- leetcode-136-只出现一次的数字
- dealloc时取weakself引起崩溃
- wine mac 中文 方块乱码 解决
- html div怎么设置圆角,jquery设置div圆角
- chmod ug s oracle,Linux chmod设置目录和文件不同权限
- Eclipse RCP中Viewer交互的三种方式/Make your Eclipse applications richer with view linking
- canvas 绘制贪吃蛇游戏 1
- Baidu 人脸识别FireFly 与PC连接调试
- 【matlab小白训练】BP神经网络
- 计算机图形学 参数曲线和曲面的相关知识点
- 设置计算机网络文件共享,局域网电脑文件共享怎么设置
- BigDATA面试题
- 蓝字冲销是什么意思_会计记账,贷方红字,贷方蓝字什么意思
- 片上总线Wishbone 学习(二)Wishbone总线标准介绍
- springboot Nexus Repository Maven仓库搭建及使用
- python 递归,迭代器,生成器,面向过程编程