精华内容
下载资源
问答
  • 计算机程序中的浮点数分为单精度浮点数和双精度浮点数。单精度和双精度精确的范围不一样。计算机里的最基本的存储单位用位(bit)来表示。bit只能用来存储0或1。稍大一点的单位是字节(Byte,简写为B)。再大一级的是千...

    上节课 简单介绍了浮点数。计算机程序中的浮点数分为单精度浮点数和双精度浮点数。

    单精度和双精度精确的范围不一样。

    计算机里的最基本的存储单位用位(bit)来表示。bit只能用来存储0或1。

    稍大一点的单位是字节(Byte,简写为B)。

    再大一级的是千字节(kilo Bytes),用k来表示。

    再大一级的单位是兆字节(Mega Bytes),用M来表示。一张照片的大小通常为1~3M。

    再大一级的单位为G。一部高清电影的大小通常为1~2G。

    再大一级的单位为T。

    换算关系为:

    1B = 8bit

    1k = 1024B = 2^10 B

    1M = 1024k = 2^20 B

    1G = 1024M = 2^30 B

    1T = 1024G = 2^40 B

    单精度(float)在计算机中存储占用4字节,32位,有效位数为7位(6位小数+小数点)。

    双精度(double)在计算机中存储占用8字节,64位,有效位数为16位(15位小数+小数点)。

    不管是float还是double,在计算机中的存储都遵循IEEE规范,使用二进制科学计数法,都包含三个部分:符号位、指数位和尾数部分。其中float的符号位、指数位(即整数部分)、尾数部分分别为1, 8, 23。双精度则分别为1, 11, 52。

    72585e13087e5cbebed59264e797c26c.png

    float

    e275fab3ae554e3896079cdb57144fa6.png

    double

    精度主要取决于尾数部分的位数,float为23位,最小为2的-23次方,约等于1.19乘以10的-7次方,所以float小数部分只能精确到后面6位,加上小数点算做一位,即有效数字为7位。

    类似,double 尾数部分52位,最小为2的-52次方,约为2.22乘以10的-16次方,所以精确到小数点后15位,有效位数为16位。

    程序验证:

    #include

    int main()

    {

    float a = 1.123456789;

    printf("a = %20.9f\n", a);

    double b = 2.123456789;

    printf("b = %20.9f\n", b);

    return 0;

    }

    注意:这里%20.9f表示浮点数总共有20位,其中小数占9位。不足20位的部分,左侧用空格来填充。

    运行结果:

    a = 1.123456836

    b = 2.123456789

    从运行结果可以看出,单精度浮点数小数部分只有前6位是准确的,后三位是不准确的。双精度小数部分9位都是准确的。

    展开全文
  • java代码-实训1 编程实现给出5个双精度浮点数,求和再求平均数。
  • 本文就带各位温顾温顾java浮点型、单精度浮点数、双精度浮点数。浮点型首先明确java中浮点型数据类型主要有:单精度float、双精度double至于浮点型就是跟int ,string类型差不多。都是数据类型。浮点型浮点型别给我...

    作为一名java学习者,怎能不懂这些java基础中的基础呢?本文就带各位温顾温顾java浮点型、单精度浮点数、双精度浮点数。

    4dd659066cae1717d9d31ca55828bd50.png

    浮点型首先明确java中浮点型数据类型主要有:单精度float、双精度double

    至于浮点型就是跟int ,string类型差不多。都是数据类型。

    浮点型浮点型别给我整些花里胡哨的定义,浮点型简单来说就是表示带有小数的数据,而恰恰小数点可以在相应的二进制的不同位置浮动,可能是这样就被定义成浮点型了。~不得不佩服这文化程度,定义个数据名称都这么有深度~

    浮点型常量 Java的实常数有两种表示形式:1、 十进制数形式:由数字和小数点组成,且必须有小数点,如0.123 , 123.0

    2、科学计数法形式:如:123e3或123E3,其中e或E之前必须有数字,且e或E后面的指数必须为整数(当然也包括负整数)。

    科学计数法中的E

    了解浮点型常量 Java的实常数有两种表示形式之后,很有必要给各位科普科普下科学计数法中E的面貌了~E是指数的意思,E代表的英文是exponent,E表示10的多少次方的意思。

    比如7.823E5 = 782300 这里E5表示10的5次方,再比如54.3E-2 = 0.543这里E-2表示10的-2次方

    再补充一点(针对负次方理解)一个数的负几次方就是这个数的几次方的倒数。

    比如: 2的负1次方=2的1次方分之一=1/2

    比如: 3的负2次方=3的2次方分之一=1/9

    单精度浮点数(float)单精度浮点数在机内占4个字节、有效数字8位、表示范围:-3.40E+38 ~ +3.40E+38

    在Java语言当中,所有的浮点型字面值 ~【V8提示】浮点型简单来说就是表示带有小数的数据~ 默认当做double类型来处理,要想该字面值当做float类型来处理,需要在字面值后面添加F/f,或者强制装换为float。具体如下代码:public static void main(String[] args) {

    //3.10是浮点型,浮点型字面值默认当做double类型来处理,直接编译通过;

    double d=3.10;

    //3.10是浮点型,则必须加 F或者f,若没加,直接编译不通过,会报错“损失精度”

    float f=3.10; //编译出错会报错“损失精度”

    // 解决办法:

    // 第一种方式:强制类型转换

    float f1=(float)5.1;

    // 第二种方式:没有类型转换;

    folat f2=5.1f;

    }

    再来看看下面的测试,结果肯定十之八九会在意料之外,哈哈~public static void main(String[] args) {

    float a = 12345678.90123456789f;

    double b=0.12345678901234567890;

    float c=0.12345678901234567890f;

    System.out.println(a);

    System.out.println(b);

    System.out.println(c);

    打印结果

    a = 1.2345679E7

    b = 0.12345678901234568

    c = 0.12345679

    }

    双精度浮点数(double)双精度浮点数在机内占8个字节、有效数字16位、表示范围:-1.79E+308 ~ +1.79E+308

    double的精度太低,不适合用于做财务软件,财务涉及到钱的问题,要求精度较高,所以在java中有一个基础的类库名为:java.math.BigDecimal,但这个BigDecimal类型是引用类型不是基础类型,切记!!!

    在讲单精度浮点数(float)的时候,差不多顺道把double之间的区别讲了哈哈,所以最后给张很经典的图片“敷衍敷衍”下,哈哈哈 ~哎哎哎..别打...别打...别打脸QAQ~

    04a42626e6672cf17e4be79d5a2270b2.png

    本文来自 java入门 栏目,欢迎学习!

    展开全文
  • java代码-实训2.编程实现给出5个双精度浮点数,求和,再求平均数。
  • * 十六进制单精度浮点数,转BigDecimal,保留2为小数,截掉多余小数位 * @param hex * @return */ public static BigDecimal hexFloat2BigDecimal(String hex) { float value = Float.intBitsToFloat((int)...
        /**
         * 十六进制单精度浮点数,转BigDecimal,保留2为小数,截掉多余小数位
         * @param hex
         * @return
         */
        public static BigDecimal hexFloat2BigDecimal(String hex) {
            float value = Float.intBitsToFloat((int)Long.parseLong(hex, 16));
            System.out.println(value);
            BigDecimal bd = new BigDecimal(Float.toString(value));
            return bd.setScale(2, BigDecimal.ROUND_DOWN);
        }
    
    
        /**
         * 十六进制双精度浮点数,转BigDecimal,保留2为小数,截掉多余小数位
         * @param hex
         * @return
         */
        public static BigDecimal hexDouble2BigDecimal2(String hex) {
            double value = Double.longBitsToDouble(Long.valueOf(hex,16).longValue());
            System.out.println(value);
            BigDecimal bd = BigDecimal.valueOf(value);
            return bd.setScale(2, BigDecimal.ROUND_DOWN);
        }

     

    展开全文
  • 本篇先介绍IEEE754标准中针对浮点数的规范,然后以问答形式补充有关浮点数的知识点。(一)IEEE754标准IEEE754标准即IEEE浮点数算术标准,由美国电气电子工程师学会(IEEE)计算机学会旗下的微处理器...表一单精度浮点数...

    本篇先介绍IEEE754标准中针对浮点数的规范,然后以问答形式补充有关浮点数的知识点。

    (一)IEEE754标准

    IEEE 754 标准即IEEE浮点数算术标准,由美国电气电子工程师学会(IEEE)计算机学会旗下的微处理器标准委员会发布。

    以32位float数据为例,在内存中的存储形式是1bit的符号位(S),8bit表示指数部分(Exp),23表示小数部分的尾数(Fraction)。

    表一 单精度浮点数在内存中存储形式

    1bit符号

    8bit指数部分

    23bit尾数

    符号位——S取0时表示负数,取1时表示负数。

    指数部分——使用所谓的偏正值形式表示,而不是补码表示,即指数部分采用一个无符号的正数值存储。也就是说指数部分要表示的值等于实际存储值减去一个固定值(对于单精度float类型,是127)。采用这种方式表示的目的是简化比较,因为,如果采用补码表示的话,全体符号位S和Exp自身的符号位将导致不能简单的进行大小比较。因为指数值的大小从0~255(0和255是特殊值),单精度的指数部分范围是-127~+128(对应的,-127和128是特殊值)。

    尾数部分——23bit尾数仅能表示小数部分的尾数,小数部分最高有效位由指数部分决定,具体见下表。小数部分最高有效位是1的数被称为正规形式。小数部分最高有效位是0的数被称为非正规形式,其他情况是特殊值。

    表二 单精度浮点数表示规则

    符号

    指数

    部分

    指数部分-127

    尾数部分

    小数部分的

    最高有效位

    形式

    1

    255

    128

    非0

    没有

    NaN

    1

    255

    128

    0

    没有

    负无穷

    1

    1~254

    -126~127

    任意

    1

    正规形式(负数)

    1

    0

    -127

    非0

    0

    非正规形式(负数)

    1

    0

    -127

    0

    没有

    负0

    0

    0

    -127

    0

    没有

    正0

    0

    0

    -127

    非0

    0

    非正规形式(正数)

    0

    1~254

    -126~127

    任意

    1

    正规形式(正数)

    0

    255

    128

    0

    没有

    正无穷

    0

    255

    128

    非0

    没有

    NaN

    按照IEEE标准,除了NaN以外,浮点数集合中的所有元素都是有序的。如果把它们从小到大按顺序排列好,那顺序将会是:负无穷,正规形式(负数)、非正规形式(负数)、负0、正0、非正规形式(正数)、正规形式(正数)、正无穷。

    对于64bit的双精度double类型,在内存中的存储形式是1bit的符号位(S),11bit表示指数部分(Exp),52bit表示小数部分的尾数(Fraction)。指数部分的偏正值是1023,其他情况跟单精度类似,不再赘述。

    (二)浮点数Q&A

    1)浮点数可以表示数据的范围是什么?

    不考虑特殊值(无穷大、NaN等),浮点数可以表示的范围是[-Max,Max]。其中Max是浮点数能表示的最大值,具体值参见表三。

    表三 浮点数最大值

    浮点类型

    字节码

    16进制表示

    10进制表示

    单精度

    7f7fffff

    0x1.fffffep127

    3.4028235E38

    双精度

    7fefffffffffffff

    0x1.fffffffffffffp1023

    1.7976931348623157E308

    2)浮点数的精度怎样衡量?

    浮点数指数部分Exp的数值决定了浮点数与相邻浮点数的差值,所以,指数部分越小(单精度最小为-127),即浮点数绝对值越小(也就是浮点数越靠近0),相邻浮点数的差值越小(单精度最小为2^(-127)),浮点数能表示的有效小数位数越多。反之,指数部分越大(单精度最大为127),即浮点数绝对值越大(也就是浮点数越远离0),相邻浮点数的差值越大(单精度最小为2^(127)),浮点数能表示的有效小数位数越少。但是,从科学计算的角度看,不管指数部分的数值是多少,浮点数的有效位数由尾数部分决定,单精度的有效数是7位,双精度的有效数是16位。

    表四 浮点数最小正数

    浮点类型

    字节码

    16进制表示

    10进制表示

    单精度最小正数

    00000001

    0x0.000002p-126

    1.4E-45

    双精度最小正数

    0000000000000001

    0x0.0000000000001p-1022

    4.9E-324

    3)我们知道,在Java中,存在基本数据类型的自动转换,比如,直接将一个整形字面量赋给一个float变量。 那么,在自动转换后,整形的精度会丢失么?

    当浮点集中没有与整形值对应的浮点数时,会将整形值转化成最接近的浮点值,此时,整形值会丢失精度。例如下面的例子,数值为33554431的整形转化成单精度浮点数后,变成3.3554432E7,即33554432。

    int intValue = Integer.MAX_VALUE >> 6;// 33554431

    float floatFromInt = intValue;

    System.out.println(floatFromInt);// 3.3554432E7

    System.out.println(intValue);// 33554431

    最后附查看某些浮点数字节码、16进制表示、10进制表示的源码及运行结果。

    单精度源码及结果。

    8f900a89c6347c561fdf2122f13be562.png

    961ddebeb323a10fe0623af514929fc1.png

    1 packagecom.wsm.test;2

    3 public classTestFloat {4

    5 /**

    6 *@paramargs7 */

    8 public static voidmain(String[] args) {9

    10 int intValue = Integer.MAX_VALUE >> 6;//33554431

    11 float floatFromInt =intValue;12 System.out.println(floatFromInt);//3.3554432E7

    13 System.out.println(intValue);//33554431

    14

    15 System.out.printf("%-12s\t%-20s%-12s%-20s\n", "描述", "十六进制数",16 " 字节码", " 十进制数");17 print("正 无 穷", Float.POSITIVE_INFINITY);18 print("最 大 值", Float.MAX_VALUE);19 print("最小正规形式正数", Float.MIN_NORMAL);20 print("最大非正规形式值", +0x0.fffffep-127f);21 print("最 小 正 数", Float.MIN_VALUE);22 print("负 无 穷", Float.NEGATIVE_INFINITY);23 print("规 范 的 NaN", Float.NaN);24 print("其 他 的 NaN", Float.intBitsToFloat(Integer25 .valueOf(0xffc54321)));26

    27 }28

    29 static void print(String describe, floatfloatNum) {30 System.out.printf("%-12s\t%-20s%-12s%-20s\n", describe, Float31 .toHexString(floatNum), insertZero(Integer.toHexString(Float32 .floatToRawIntBits(floatNum)), 8), floatNum);33 }34

    35 static String insertZero(String input, intlength) {36 StringBuilder sb = newStringBuilder(input);37 while (sb.length()

    Float

    3.3554432E7

    33554431

    描述           十六进制数                       字节码             十进制数

    正        无         穷 Infinity            7f800000    Infinity

    最        大         值 0x1.fffffep127      7f7fffff    3.4028235E38

    最小正规形式正数     0x1.0p-126          00800000    1.17549435E-38

    最大非正规形式值     0x0.8p-126          00400000    5.877472E-39

    最    小      正    数 0x0.000002p-126     00000001    1.4E-45

    负         无        穷 -Infinity           ff800000    -Infinity

    规     范     的 NaN NaN                 7fc00000    NaN

    其     他     的 NaN NaN                 ffc54321    NaN

    双精度源码及结果。

    8f900a89c6347c561fdf2122f13be562.png

    961ddebeb323a10fe0623af514929fc1.png

    1 packagecom.wsm.test;2

    3 public classTestDouble {4

    5 /**

    6 *@paramargs7 */

    8 public static voidmain(String[] args) {9

    10 System.out.printf("%-12s\t%-30s%-24s%-40s\n", "描述", "十六进制数",11 " 字节码",12 " 十进制数");13 print("正 无 穷", Double.POSITIVE_INFINITY);14 print("最 大 值", Double.MAX_VALUE);15 print("最小正规形式正数", Double.MIN_NORMAL);16 print("最大非正规形式值", +0x0.fffffffffffffp-1023d);17 print("最 小 正 数", Double.MIN_VALUE);18 print("负 无 穷", Double.NEGATIVE_INFINITY);19 print("规 范 的 NaN", Double.NaN);20 print("其 他 的 NaN", Double.longBitsToDouble(Long21 .valueOf(0xfff8000000054321L)));22

    23 }24

    25 static voidprint(String describe, Double DoubleNum) {26 System.out.printf("%-12s\t%-30s%-24s%-40s\n", describe, Double27 .toHexString(DoubleNum), insertZero(Long.toHexString(Double28 .doubleToRawLongBits(DoubleNum)), 16), DoubleNum);29 }30

    31 static String insertZero(String input, intlength) {32 StringBuilder sb = newStringBuilder(input);33 while (sb.length()

    Double

    描述           十六进制数                                           字节码                                      十进制数

    正        无         穷 Infinity                      7ff0000000000000        Infinity

    最        大         值 0x1.fffffffffffffp1023        7fefffffffffffff        1.7976931348623157E308

    最小正规形式正数     0x1.0p-1022                   0010000000000000        2.2250738585072014E-308

    最大非正规形式值     0x0.8p-1022                   0008000000000000        1.1125369292536007E-308

    最    小      正    数 0x0.0000000000001p-1022       0000000000000001        4.9E-324

    负         无        穷 -Infinity                     fff0000000000000        -Infinity

    规     范     的 NaN NaN                           7ff8000000000000        NaN

    其     他     的 NaN NaN                           fff8000000054321        NaN

    参考资料:

    2、《Java虚拟机规范(Java SE 7)》

    展开全文
  • 本文就带各位温顾温顾java浮点型、单精度浮点数、双精度浮点数。浮点型首先明确java中浮点型数据类型主要有:单精度float、双精度double至于浮点型就是跟int ,string类型差不多。都是数据类型。浮点型浮点型别给我...
  • 单精度浮点数和双精度浮点数Here you will learn about difference between float and double i.e. float vs double. 在这里,您将了解float和double的区别,即float vs double。 These are two commonly used ...
  • 所以我目前正在开发一个将IEEE-754单精度和双精度浮点数转换为十进制数的程序 . 该程序有一个 java.lang.NumberFormatException 抛出 . 我希望有人向我解释为什么会抛出它以及我应该如何修复它 .//This is the ...
  • 单精度浮点数与双精度浮点数区别

    万次阅读 2020-04-06 15:14:35
    单精度浮点数与双精度浮点数区别 1、所占的内存不同 单精度浮点数占用4个字节(32位)存储空间来存储一个浮点数,包括符号位1位,阶码8位,尾数23位。 而双精度浮点数使用 8个字节(64位)存储空间来存储一个浮点数...
  • Java 实现16进制转10进制双精度浮点数 新人第一次做项目,是用通过mqtt获取燃气表数据,传来的数据是寄存器数据需要进行转换、拼接。两个数值进行10进制转16进制转换,然后拼接成16进制,再换算位双精度浮点数。 ...
  • Java中的浮点数比较

    2021-02-25 18:52:57
    返回:false原因:精度丢失,比较结果是不对的。底层原理是什么呢,我们来看看:类型升级(type promotion)java中的几种原生的数值类型进行==或!=等比较运算时,如果运算符两边的数值类型不同,则首先会进行类型升级...
  • 126) * 0.1 = 2**(-127) 0 00000000 00000000000000000000001 = +1 * 2**(-126) * 0.00000000000000000000001 = 2**(-149) (Smallest positive value) 双精度 IEEE双精度浮点标准表示需要64位字,其可以从左到右表示...
  • 输入一个字符,一个数字,一个单精度浮点数,一个双精度浮点数,按顺序输出它们四个 且数字指定占4个字符宽靠右对齐,单精度浮点数保留2位小数,双精度保留12位小数,占一行输出、空格分隔 #include<stdio.h> ...
  • java代码-实训2.编程实现给出5个双精度浮点数(1.1, 2.2, 3.3, 4.4, 5.5),求和,再求平均数
  • 一道期末题~关于双精度浮点数的加和和乘积,从键盘录入所输入的数,有异常环节,可以查出错误并且指出原因。
  • /* * %6.3f: 6:总长度,3表示小数位,f:单精度 总长度=小数点+小数位+整数位 * %m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。 */
  • Does a float have 32 binary digits and a double have 64 binary digits? The documentation was too hard to make sense of.Do all of the bits translate to significant digits? Or does the location of the d...
  • 2.IEEE 64位浮点数格式 这种格式的特点是:每个数由8字节组成,包括1位符号位,11位带符号阶码,52位尾数。 例如:我们收到一个数的格式是 3F F0 6F 80 00 00 00 00,那么它的二进制格式是: 0011 1111 1111 ...
  • 输入一个双精度浮点数,输出这个浮点数的%f结果、保留5位小数的结果、%e、%g格式的结果 #include<stdio.h> int main() { double a; scanf("%lf", &a); printf("%lf\n", a); printf("%.5lf\n", a); printf...
  • 读入一个双精度浮点数,保留12位小数,输出这个浮点数。 【输入】 只有一行,一个双精度浮点数。 【输出】 也只有一行,保留12位小数的浮点数。 【输入样例】 3.1415926535798932 【输出样例】 3.141592653580 ...
  • Java浮点数计算精度问题总结首先看看下面几个简单的加法计算的输出结果:System.out.println(0.1 + 0.2); //输出:0.30000000000000004System.out.println(1.1 + 1.2); //输出:2.3System.out.println(0.1f + 0.2f);...
  • java代码-2. 编程实现给出5个双精度浮点数(1.1,2.2,3.3,4.4,5.5),求和,再求平均数。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,512
精华内容 10,204
关键字:

java双精度浮点数

java 订阅