精华内容
参与话题
问答
  • double类型解析

    千次阅读 2016-12-08 22:58:36
    double类型存储规定:把浮点数化成小数点前只有1位的小数与2的指数的乘积的形式,存储小数点后的52位,2的指数及数的符号。sizeof(double) // 8个字节#include //利用共用体的特点,所有类型共用一段最大的内存空间...

    double类型存储规定:把浮点数化成小数点前只有1位的小数与2的指数的乘积的形式,存储小数点后的52位,2的指数及数的符号。

    sizeof(double) // 8个字节

    #include <stdio.h>
    //利用共用体的特点,所有类型共用一段最大的内存空间
    typedef union {
        double d;
        char byte[8];
    }BIT;
    
    int main()
    {
        int i;
        BIT u;
        u.d = 10.2345;
        for(i = 0; i < 8; ++i) {
            //16进制输出
            printf("%02x ",u.byte[i]);
        }
        putchar('\n');
        return 0;
    }

    输出结果:
    这里写图片描述
    计算机数据的读写方向为从右到左,即左高右低;
    所以修改为:
    40 24 78 10 62 4d d2 f2

    转化为二进制:
    0100 0000 0010 0100 0111 1000 0001 0000 0110 0010 0100 1101 1101 0010 1111 0010

    前12位为2指数:0100 0000 0010 -> 1026

    后52位小数部分:0100 0111 1000 0001 0000 0110 0010 0100 1101 1101 0010 1111 0010

    当指数为0时,对应二进制位0011 1111 1111 -> 1023

    所以上式对应二进制指数为1026 -1023 = 3;

    double型小数点前只有1位1,所以剩下的52位小数部分

    0100 0111 1000 0001 0000 0110 0010 0100 1101 1101 0010 1111 0010

    结果为: 1.小数部分 * 2^指数部分;

    1.0100 0111 1000 0001 0000 0110 0010 0100 1101 1101 0010 1111 0010

    化为10进制数为:1.279312500000000074606987254810519516468048095703125

    乘以 2 ^ 3得:

    10.234500000000000596855898038484

    验证浮点型的近似型,所以尽量不对浮点型进行== 和!= 判断,否则可能会产生意想不到的结果。

    float类型基本类似,只是有8字节变为4个字节,博客链接
    float类型存储

    参考资料:《程序员入门必备 狂人C》

    展开全文
  • double类型的输出方式

    万次阅读 2017-01-18 23:30:10
    摘自歌本哈根的冬天ChinaUnix博客关于double类型的输入/输出格式  double (双精度浮点型)类型是C语言的基本类型之一,占有8个字节最大可以表示到1.7*10^308,一般情况下,都可以满足程序的需要。  double ...

    摘自歌本哈根的冬天ChinaUnix博客关于double类型的输入/输出格式

     double (双精度浮点型)类型是C语言的基本类型之一,占有8个字节最大可以表示到1.7*10^308,一般情况下,都可以满足程序的需要。

     double 常规输出为%lf(注意float类型输出为%f) 例如:定义double a = 1.0;输出用printf("%lf",a);
      但是double类型在默认情况下,输出小数点后6位,我们通常要减少其小数点后的长度。则可以使用 "%m.nlf"的形式,其中m和n都为正整数。m表示输出的浮点型的数据占m位,  如果实际长度不等于m,则按实际长度输出,n表示输出的小数点位数。所以说,m实际上可以不用管,直接用0代替或者不写都可以!
       例如上面输出为:1.000000(默认情况下)
       若将输出格式改为"%0.0lf" 或"%4.0lf" 则输出为1(m!=实际长度)
        顺便说一下,在VC中C语言不支持long long int类型,而在Linux下支持。long long int 也占有8个字节

    展开全文
  • float型和double型数据的存储方式

    万次阅读 多人点赞 2019-06-26 21:22:37
    对于浮点类型的数据采用单精度类型(float)和双精度类 型(double)来存储,float数据占用32bit,double数据占用64bit。通常 float可以保证十进制科学计数法小数点后6位有效精度和第7位的部分精度 double可以保证十...

    float型和double型数据的存储方式

    对于浮点类型的数据采用单精度类型(float)和双精度类 型(double)来存储,float数据占用32bit,double数据占用64bit。通常

    float可以保证十进制科学计数法小数点后6位有效精度和第7位的部分精度

    double可以保证十进制科学计数法小数点后15位有效精度和第16位的部分精度。

    因为float和double的精度是由尾数决定的,什么是尾数呢,下面看看浮点型数据在底层是如何存储的。

     

    我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么?

     

    其实不论是float还是double在存储方式上都是遵从IEEE的规范 的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53

     

    无论是单精度还是双精度在存储中都分为三个部分:

     

    1. 符号位(Sign) : 0代表正,1代表为负
    2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且要加上偏移量(float偏移127,double偏移量1023
    3. 尾数部分(Mantissa):尾数部分

     

    其单精度float的存储方式如下图所示:

    而双精度double的存储方式为:

     

    R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十进制的科学计数法表示就为:8.25*100,而120.5可以表示为:1.205*102

    可是计算机根本不认识十进制的数据,只认识0,1,所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示,8.25用二进制表示可表示为1000.01,120.5用二进制表示为:1110110.1。用二进制的科学计数法表示1000.01可以表示为1.00001*23,1110110.1可以表示为1.1101101*26。任何一个数都的科学计数法表示都为1.XXX*2n。尾数部分就可以表示为xxxx,第一位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了 24bit。

     

    奇怪输出结果:

    首先我们看看2.25的单精度存储方式,2.25 -->  10.01 -->  1.001*21

    符号位0,指数部分1+127 --> 10000000

    尾数部分:001 0000 0000 0000 0000 0000

    很简单 0  1000 0000   001 0000 0000 0000 0000 0000,

    而2.25的双精度表示为:0  100 0000 0000  0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000,这样2.25在进行强制转换的时候,数值是不会变的

     

    而我们再看看2.2呢

    发现小数部分的二进制是一个无限循环的排列 00110011001100110011...

    对于单精度数据来说,尾数只能表示23bit的精度,所以2.2的float存储为:

    2.2 --> 10.0011001100110011001100 -->1.00011001100110011001100*21

    符号位0,指数部分1+127 --> 1000 0000

    尾数部分:00011001100110011001100

    0  1000 0000  00011001100110011001100

    但是这样存储方式,换算成十进制的值,却不会是2.2的

     

     

    因为十进制在转换为二进制的时候可能会不准确,如2.2,而double类型的数据也存在同样的问题,所以在浮点数表示中会产生些许的误差,在单精度转换为双精度的时候,也会存在误差的问题

     

     

     

     

     

     

     

     

     

    展开全文
  • [八]基础数据类型Double详解

    万次阅读 2018-10-09 10:15:00
    Double 基本数据类型double 的包装类 Double 类型的对象包含一个 double 类型的字段 属性简介 用来以二进制补码形式表示 double 值的比特位数 public static final int SIZE = 64; 二进制补码形式表示 ...

    Double 基本数据类型double  的包装类

    Double 类型的对象包含一个 double 类型的字段

    image_5bbc0d42_356e

     

    属性简介

    用来以二进制补码形式表示 double 值的比特位数 public static final int SIZE = 64;
    二进制补码形式表示 double 值的字节数 public static final int BYTES = SIZE / Byte.SIZE;
    表示基本类型 double 的 Class 实例 public static final Class<Double>   TYPE = (Class<Double>) Class.getPrimitiveClass("double");
    能够表示的最大值
    只有标准化一种形式,也就是前文提到过的
    image_5bbc0d42_caa
    public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; 
    标准化的最小值
    image_5bbc0d42_27a0
    public static final double MIN_NORMAL = 0x1.0p-1022;
    最小值还有非标准化的形式
    image_5bbc0d42_4fe1
    public static final double MIN_VALUE = 0x0.0000000000001P-1022;
    正无穷
    等同于Double.longBitsToDouble(0x7ff0000000000000L)
    public static final double POSITIVE_INFINITY = 1.0 / 0.0;
    负无穷
    等同于Double.longBitsToDouble(0xfff0000000000000L).
    public static final double NEGATIVE_INFINITY = -1.0 / 0.0
    NaN
    not a number
    等同于Double.longBitsToDouble(0x7ff8000000000000L) 
    public static final double NaN = 0.0d / 0.0
    指数真值的有效的最大值 public static final int MAX_EXPONENT = 1023
    指数真值的有效的最小值 public static final int MIN_EXPONENT = -1022

     

    这些属性,看过浮点数简介的话,可以很清晰的理解,再次说明下,但凡本人的系列文章,全部都是有顺序的     

    构造方法

    Double 依然提供了根据基本类型double以及double的String形式构造

    String形式依然借助于parseXXX形式 parseDouble

    Double(double value) image_5bbc0d42_71a2
    Double(String s) image_5bbc0d42_4304

    常用方法

    对于浮点数,有一些额外的属性方法

    我们浮点数介绍中,对于浮点数的表示形式进行了介绍

    image_5bbc0d42_625a

    Double提供了对于指定值的表示形式的获取方法, 这表示形式也就是是一个64位的二进制位序列

     

    Double 获取表示形式
    对于获取表示形式 提供了两种形式的方法,主要是针对于非数字的NaN的不同表示

    他们可以与longBitsToDouble 可以进行互相转换
    doubleToRawLongBits(double)

    根据 IEEE 754 浮点“双精度格式”位布局,返回指定浮点值的表示形式,并保留 NaN 值

    如果参数是正无穷大,则结果为 0x7ff0000000000000L

    如果参数是负无穷大,则结果为 0xfff0000000000000L

    如果参数是 NaN,则结果是表示实际 NaN 值的 long 整数

     

    与 doubleToLongBits 方法不同

    doubleToRawLongBits 并没有将 NaN 编码为一个“规范的”NaN 值

     

    在所有情况下,结果都是一个 long 整数

    将其赋予 longBitsToDouble(long) 方法将生成一个与 doubleToRawLongBits 的参数相同的浮点值

     

     

    本地方法

    image_5bbc0d42_6397

    doubleToLongBits(double)

    根据 IEEE 754 浮点双精度格式 ("double format") 位布局,返回指定浮点值的表示形式

     

    如果参数是正无穷大,则结果为 0x7ff0000000000000L

    如果参数是负无穷大,则结果为 0xfff0000000000000L

    如果参数是 NaN,则结果为 0x7ff8000000000000L

     

    在所有情况下,结果都是一个 long 整数

    将其赋予 longBitsToDouble(long) 方法将生成一个与 doubleToLongBits 的参数相同的浮点值

    (所有 NaN 值被压缩成一个“规范”NaN 值时除外)

     

    也就是NaN的处理不一样,此方法将NaN全部规范化为指定固定的值

     

    依赖  doubleToRawLongBits

    image_5bbc0d42_3511

    longBitsToDouble(long)
    返回对应于给定位表示形式的 double 值
     

    如果参数是 0x7ff0000000000000L,则结果为正无穷大

    如果参数是 0xfff0000000000000L,则结果为负无穷大

    如果参数值在 0x7ff0000000000001L 到 0x7fffffffffffffffL 之间或者在 0xfff0000000000001L 到 0xffffffffffffffffL 之间,则结果为 NaN

     

     

    浮点数有几种特殊的表示,比如 无穷 NaN等

    额外的,也提供了一些相关的方法

     

    static boolean isNaN(double v) 静态方法
    是否一个非数字 (NaN) 值
    非数值 true
    image_5bbc0d42_2842
    static boolean isFinite(double d) 静态方法
    是否是有限的浮点数
    有限的true
    image_5bbc0d42_2240
    static boolean isInfinite(double v) 静态方法
    是否是无穷大
    是无穷大  true
    image_5bbc0d42_5a46
    boolean isInfinite() 实例方法
    依赖静态方法
    image_5bbc0d42_1e28
    boolean isNaN()

    实例方法

    依赖静态方法

    image_5bbc0d42_34d6

     

    比较

    static int compare(double d1, double d2) 静态方法
    比较两个double
    d1 < d2 小于0
    d1 = d2 等于0
    d1 > d2 大于0
    int compareTo(Double anotherDouble) 实例方法
    两个对象进行大小比较,依赖于静态方法
    image_5bbc0d42_5464

     

    parseXXX系列

    字符串解析 为 基本类型,

    不需要对象,所以都是静态方法

    image_5bbc0d42_28d1

    返回一个字符串形式表示的基本类型double
    表现效果同valueOf(String),不过valueOf 返回的是对象
    如果不包含可以解析的字符串将会抛出异常
    底层依赖sun.misc.FloatingDecimal
    image_5bbc0d42_1d10
     

     

    valueOf系列    

    把基本基本类型 包装为对象

    用来创建获得对象,所以无需对象,全都是静态方法

    image_5bbc0d42_6c31

     

    不同于之前介绍的整数 数值,他们都有缓冲

    Double v不存在缓存,valueOf也是直接new 对象

    static Double valueOf(double d) image_5bbc0d42_39df
    static Double valueOf(String s) 依赖parseDouble方法
    所以上面说跟valueOf(String)表现效果相同,本身就是一样
    image_5bbc0d42_2394

     

    Double没有 decode方法

    XXXValue系列

    类似之前介绍的其他数值类型
    全部都是强转内部的  value
    return (XXX)value;

    byteValue()

    shortValue()

    intValue()

    longValue()

    floatValue()

    doubleValue()

     

    toString  toXXXString  系列

    toString(double)

    toString()

    toHexString(double)

     

    static String toString(double d) 静态方法
    image_5bbc0d42_2268
    String toString() 实例方法
    内部调用  static String toString(double d)
    image_5bbc0d42_1586
    static String toHexString(double d) 静态方法
    返回 double参数的十六进制字符串表示形式
    API帮助文档中对于字符的转换有明确的规定,可以仔细研究下

    示例
    image_5bbc0d42_430f

    toString系列好像没什么好说的,又好像有很多要说的

    用到的时候对于格式字符的规定有疑惑直接查看API

    equals

    boolean equals(Object obj) 

    将此对象与指定对象比较

    当且仅当参数不是 null 而是 Double 对象,且表示的 Double 值与此对象表示的 double 值相同时,结果为 true

    为此,当且仅当将方法 doubleToLongBits(double) 应用于两个值所返回的 long 值相同时,才认为这两个 double 值相同

    注意,在大多数情况下,对于 Double 类的两个实例 d1 和 d2,当且仅当

       d1.doubleValue() == d2.doubleValue()

    为 true 时,d1.equals(d2) 的值才为 true

     

    但是,有以下两种例外情况:

     

    如果 d1 和 d2 都表示 Double.NaN,那么即使 Double.NaN==Double.NaN 值为 false,equals 方法也将返回 true

    如果 d1 表示 +0.0 而 d2 表示 -0.0,或者相反,那么即使 +0.0==-0.0 值为 true,equals 测试也将返回 false

    此定义使得哈希表得以正确操作

     

    image_5bbc0d43_411

     

    hashCode

    static int hashCode(double value) 静态方法
    获得一个value的hashcode值
    image_5bbc0d43_4f6e
    int hashCode() 实例方法
    依赖静态方法
    image_5bbc0d43_de9

     

    其他方法

    sum(double, double) image_5bbc0d43_5ab4
    max(double, double) image_5bbc0d43_5dd1
    min(double, double) image_5bbc0d43_516d

     

    总结

    其实浮点数的表示形式与使用规范才是重点

    就像Float似的, Double只是double的包装,double也只是IEEE754 标准的一个实现,根本还是在于标准的理解

    Double  和 Float 提供的方法结构基本上是一样的,毕竟都是浮点数,标准也都是IEEE754 

     

    至此,已经介绍了,基本类型包装类中的数值部分

    也就是Byte  Short  Integer Long Float Double   他们作为数值有很多类似的方法

    这些类似的方法属性也可以说是作为数值类型的共性

    个人认为,找到共性能够更好理解运用 java提供的类与功能

    展开全文
  • c语言double类型printf问题

    万次阅读 多人点赞 2018-10-03 11:32:10
    结论:在c语言中,double类型的读入必须用"%lf";输出必须用"%f" 解释:double和float的精度是不同的,故存储空间也是不同的,所以如果要读入double类型,必须要用%lf来读入,以免精度丢失。而输出,由于...
  • 关于double类型输出问题

    千次阅读 2018-05-19 11:11:23
    笔试过程中,输出结果往往0.5000和0.50000000是不一样的,常年不用c语言的我,之想到了printf("%s",output),然而依旧是判题系统不通过,转念一想,是否可以用强大的cout来输出呢,分分钟写出了cout&...
  • java中基本类型double和对象类型Double

    千次阅读 2019-04-19 13:44:00
    Double.valueOf(str)把String转化成Double类型的对象比如Stirng str="1.0";那么Double.valueOf(str)等价于new Double("1.0");而doubleValue();就是求double类型的原始值,等价于double dnum=Double.valueOf(str)....
  • double型比较大小

    千次阅读 2018-11-03 16:38:36
    对于两个double类型的数,我们一般不直接比较他们的大小,因为计算机在表示小数时都有误差,我们一般认为偏差在一个较小的范围内则两个数据是相等的。 一般我们是这样做的:通过设定一个允许的误差值,对待判断是否...
  • Double类型数据的精确计算

    千次阅读 2018-05-20 19:42:03
    在Java中为什么会总是出现double值的乘积总是在一个正确的结果左右偏0.0000**1,这是因为当两个double数值相乘时,底层采用转换成二进制来进行乘法的运算,由于在乘完之后在包含小数的二进制中无法完全转换成十进制...
  • Java double数据类型

    千次阅读 2017-03-22 09:08:19
    double数据类型使用64位来存储浮点数。double值也称为双精度浮点数。 它可以表示一个最小为4.9 x 10^-324,最大为1.7 x 10^308的数字。它可以是正的或负的。 所有实数被称为double字面量。 double字面量可以...
  • double类型转换成int类型

    万次阅读 2018-08-13 16:49:37
    public class test09 { public static void main(String[] args) { double a = 5000.44; double b = 100.12; double v = a / b; int i = new Double(v).intValue(); ...
  • java double类型转换成int类型

    千次阅读 2020-05-14 21:46:05
    public static void main(String[] args) { double db = 15.87; int in = new Double(db).intValue(); System.out.println(in); } 运行结果: 15
  • 调用方法Double.parseDouble 注意Double 的 D 是大写的!
  • 在VS2012下,用cout输出float和double,为什么精度都只有6位?![![图片说明](https://img-ask.csdn.net/upload/201501/03/1420289704_645448.png)图片说明]...
  • Java中double类型转换成String类型

    千次阅读 2019-11-04 16:49:05
    /* * 如果是小数,保留两位,非小数,保留整数 * @param number ... public static String getDoubleString(double number) { String numberStr; if (((int) number * 1000) == (int) (number ...
  • Java中的Double类型计算

    千次阅读 2018-01-05 10:32:22
    转载自:Java中的Double类型计算 一、问题的提出: 如果我们编译运行下面这个程序会看到什么? public class Test{  public static void main(String args[]){  System.out.println(0.05+0.01)...
  • Double 类型精度问题

    千次阅读 2018-08-08 17:06:27
    public static void main(String[] args) { double d1 = 1.1D; double d2 = 2.2D; double d3 = d1+d2; System.out.println("d1+d2= "+d3); BigDecimal b1 = new BigDecima...
  • C++ double类型精度问题

    2018-03-20 06:58:45
    一组double类型的数字求和为什么结果为nan? 下图所示为部分数字。 ![图片说明](https://img-ask.csdn.net/upload/201803/20/1521529050_489906.png)
  • package archie2010; import java.math.BigDecimal; import java.math.MathContext; public class BigDecimalTest { /** * @param args
  • package util;import java.math.BigDecimal;... * 工具类 - 运算 double类型的数字相加不丢失精度 * */public class ArithUtil { // 默认除法运算精度 private static final int DEF_DIV_SCAL

空空如也

1 2 3 4 5 ... 20
收藏数 739,333
精华内容 295,733
关键字:

double类型