精华内容
下载资源
问答
  • 它是用来表示实数的一种方法,它用 M(尾数) * B( 基数)的E(指数)次方来表示实数,相对于定点数来说,在长度一定的情况下,具有表示数据范围大的特点。但同时也存在误差问题,这就是著名的浮点数精度问题! 浮点数...

    浮点数:

    它是用来表示实数的一种方法,它用 M(尾数) * B( 基数)的E(指数)次方来表示实数,相对于定点数来说,在长度一定的情况下,具有表示数据范围大的特点。但同时也存在误差问题,这就是著名的浮点数精度问题!   

     浮点数有多种实现方法计算机中浮点数的实现大都遵从 IEEE754 标准,IEEE754 规定了单精度浮点数和双精度浮点数两种规格,单精度浮点数用4字节(32bit)表示浮点数,格式是:1位符号位 8位表示指数 23位表示尾数;双精度浮点数8字节(64bit)表示实数,格式是:1位符号位 11位表示指数 52位表示尾数。同时,IEEE754标准还对尾数的格式做了规范:d.dddddd...,小数点左面只有1位且不能为零,计算机内部是二进制,因此,尾数小数点左面部分总是1。显然,这个1可以省去,以提高尾数的精度。由上可知,单精度浮点数的尾数是用24bit表示的,双精度浮点数的尾数是用53bit表示的,转换成十进制:

    2^24 - 1 = 16777215           

    2^53 - 1 = 9007199254740991     

    由上可见,IEEE754单精度浮点数的有效数字二进制是24位,按十进制来说,是8位;双精度浮点数的有效数字二进制是53位,按十进制来说,是16 位。

    显然,如果一个实数的有效数字超过8位,用单精度浮点数来表示的话,就会产生误差!同样,如果一个实数的有效数字超过16位,用双精度浮点数来表示,也会产生误差!

    例如:对于 1310720000000000000000.66 这个数,有效数字是24位,用单精度或双精度浮点数表示都会产生误差,只是程度不同:   

    双精度浮点数: 1310720040000000000000.00   

    单精度浮点数: 1310720000000000000000.00   

    双精度差了 0.66 ,单精度差了近4万亿!以上说明了因长度限制而造成的误差,但这还不是全部!

    采用IEEE754标准的计算机浮点数,在内部是用二进制表示的,但在将一个十进制数转换为二进制浮点数时,也会造成误差,原因是不是所有的数都能转换成有限长度的二进制数。对于131072.32 这个数,其有效数字是8位,按理应该能用单精度浮点数准确表示,为什么会出现偏差呢?看一下这个数据二进制尾数就明白了 10000000000000000001010001......显然,其尾数超过了24bit,根据舍入规则,尾数只取 100000000000000000010100,结果就造成测试中遇到的“奇怪”现象!131072.68 用单精度浮点数表示变成 131072.69 ,原因与此类似。实际上有效数字小于8位的数,浮点数也不一定能精确表示,7.22这个数的尾数就无法用24bit二进制表示,当然在数据库中测试不会有问题(舍入以后还是7.22),但如果参与一些计算,误差积累后,就可能产生较大的偏差。

    浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分

    数符: 占1位二进制,表示数的正负。
    指数符:占1位二进制,表示指数的正负。
    尾数:表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点
    指数:存指数的有效数字。

     

    单精度浮点数(float)与双精度浮点数(double), decimal 的区别如下:

    (1)在内存中占有的字节数不同

        单精度浮点数在机内占4个字节

        双精度浮点数在机内占8个字节

       decimal 在机内占16 字节 

    (2)有效数字位数不同

        单精度浮点数有效数字8位

        双精度浮点数有效数字16位

       decimal 有效数字 28位

    (3)所能表示数的范围不同

        单精度浮点的表示范围:-3.40E+38 ~ +3.40E+38(10的-38次方到10的38次方)

        双精度浮点的表示范围:-1.79E+308 ~ +1.79E+308(10的-308次方到10的308次方)

        decimal 表示的范围   : 79228162514264337593543950335,最小值:  -79228162514264337593543950335

    (4)在程序中处理速度不同
    一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快,因为内存占用小。

     

    java 示例:

    java 中  浮点数默认是 double 类型的,如果想把 浮点数赋值给 float 需要 在小数后面 加 f例如:float a=1.3;
     

    public class TestMap {
        public static void main(String[] args)  throws Exception{
    
    
          float a=0.05f;
          float b=0.02f;
          System.out.println(a-b);
        }
    }
    

    结果  : 0.030000001 

    注意 因为是float 类型有效精度为8位,所以不算开始的0以外,打印了 8位 30000001 

     

    public class TestMap {
        public static void main(String[] args)  throws Exception{
    
    
          double a=0.05f;
          double b=0.02f;
          System.out.println(a-b);
        }
    }

    结果:0.030000001192092896 

    因为 double 有效精度是 16位,所以我以为结果是16位,但是确实 17位,好奇怪,这个等待高手解答。

     

    int  4字节 范围

    uint 0~4294967295
    int -2147483648~2147483647

     

    long  8字节 范围
    long:-9223372036854775808  ~ 9223372036854775807
    ulong :0 ~   18446744073709551615

     

    int 代表 小整形 ,long 代表大整形,  无误差。

    float double decimal 代表浮点数  有误差。

    实际中使用的时候,根据业务需要 使用不同的精度就可以了(因为float double decimal 的范围都比long 要大,所以数值范围基本不用考虑,只考虑精度就可以了)

     

    对于货币性的数据,一般都是采用decimal 这个28位精度的类型,尽量避免误差。

    Double 的坑

    问题:

    System.out.println(new Double("19.9")*100);
    System.out.println( Double.valueOf("19.9")*new Double(100));

    输出结果都是 1989.9999999999998

     

    解决办法:

    String s = "19.9";
    BigDecimal temp = BigDecimal.valueOf(Double.valueOf(s));
    // 将temp乘以100
    temp = temp.multiply(BigDecimal.valueOf(100));
    int sum = temp.intValue();
    System.out.println(sum);

     

    java Bigdecimal 使用注意事项

    1 BigDecimal类的常用方法

    add(BigDecimal):BigDecimal对象中的值相加,返回BigDecimal对象
    subtract(BigDecimal):BigDecimal对象中的值相减,返回BigDecimal对象
    multiply(BigDecimal):BigDecimal对象中的值相乘,返回BigDecimal对象
    divide(BigDecimal):BigDecimal对象中的值相除,返回BigDecimal对象
    toString():将BigDecimal对象中的值转换成字符串
    doubleValue():将BigDecimal对象中的值转换成双精度数
    floatValue():将BigDecimal对象中的值转换成单精度数
    longValue():将BigDecimal对象中的值转换成长整数
    intValue():将BigDecimal对象中的值转换成整数
     

     转化为 long 或者int 的时候 有可能会 截断数据,因为 bigdecimal 的范围比 long int 大。

     转化为 double  float 的时候 精度会丢失。

    2 两数相除除不尽的问题
    public static void main(String[] args) {

        BigDecimal a = new BigDecimal(10);
        BigDecimal b = new BigDecimal(3);
        BigDecimal c = a.divide(b);
    }

    执行:抛出

    Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
    at java.math.BigDecimal.divide(BigDecimal.java:1616)

    怎么办?

    可以使用 bigdecimal 的另外一个重载函数 :

    public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

    第一参数表示除数,

    第二个参数表示小数点后保留位数,

    第三个参数表示舍入模式,只有在作除法运算或四舍五入时才用到舍入模式,有下面这几种

    ROUND_CEILING    //向正无穷的方向舍入。如果为正数,舍入结果同ROUND_UP一致;如果为负数,舍入结果同ROUND_DOWN一致。注意:此模式不会减少数值大小

    ROUND_FLOOR    //如果为正数,舍入结果同ROUND_DOWN一致;如果为负数,舍入结果同ROUND_UP一致。注意:此模式不会增加数值大小

    ROUND_DOWN    //向零方向舍入    相当于最后一位后面的都舍去  9舍不入               

    ROUND_UP    //向远离0的方向舍入  相当于最后一位加1,              0入不舍

     

    ROUND_UNNECESSARY    //计算结果是精确的,不需要舍入模式

     

    ROUND_HALF_DOWN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5  相当于于5舍6入

    ROUND_HALF_EVEN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN

    ROUND_HALF_UP    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6 ,  相当于于4舍5入

     

    3 如果设置精度

    public static void main(String[] args)
        {
            BigDecimal a = new BigDecimal("4.5635");

            a = a.setScale(3, RoundingMode.HALF_UP);    //保留3位小数,且四舍五入
            System.out.println(a);
        }

    4 减乘除其实最终都返回的是一个新的BigDecimal对象,因为BigInteger与BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象

    public static void main(String[] args)
        {
            BigDecimal a = new BigDecimal("4.5");
            BigDecimal b = new BigDecimal("1.5");
            a.add(b);

            System.out.println(a);  //输出4.5. 加减乘除方法会返回一个新的BigDecimal对象,原来的a不变


        }

    5:BigDecimal取值范围的 validation 校验问题总结
      常常在与客户端交互时需要做很多校验,在javax.validation下面有很多不错的校验规则

      @NotNull :不为空,适用任何地方(@NotBlank只是用字符类型)

      @DecimalMax:取得最大值范围

        @DecimalMin(value = "0.00", message = "") 取值最小值

     

    6构造函数

          1.public BigDecimal(double val)    将double表示形式转换为BigDecimal *不建议使用

      2.public BigDecimal(int val)  将int表示形式转换成BigDecimal

      3.public BigDecimal(String val)  将String表示形式转换成BigDecimal

     

    7 比较大小

    BigDecimal a = new BigDecimal (101);
    BigDecimal b = new BigDecimal (111);
     
    //使用compareTo方法比较
    //注意:a、b均不能为null,否则会报空指针
    if(a.compareTo(b) == -1){
        System.out.println("a小于b");
    }
     
    if(a.compareTo(b) == 0){
        System.out.println("a等于b");
    }
     
    if(a.compareTo(b) == 1){
        System.out.println("a大于b");
    }
     
    if(a.compareTo(b) > -1){
        System.out.println("a大于等于b");
    }
     
    if(a.compareTo(b) < 1){
        System.out.println("a小于等于b");
    }

     

    8 BigDecimal转String

    public static void main(String[] args) {
            // 浮点数的打印
            System.out.println(new BigDecimal("10000000000").toString());

            // 普通的数字字符串
            System.out.println(new BigDecimal("100.000").toString());

            // 去除末尾多余的0
            System.out.println(new BigDecimal("100.000").stripTrailingZeros().toString());

            // 避免输出科学计数法
            System.out.println(new BigDecimal("100.000").stripTrailingZeros().toPlainString());

            System.out.println(new BigDecimal("100.001").stripTrailingZeros().toPlainString());

       System.out.println(new BigDecimal("100.001").stripTrailingZeros().toString());

    }

    // output
    10000000000
    100.000
    1E+2
    100
    100.001
    
    100.001
    
    1. 用toPlainString()函数代替toString(),避免输出科学计数法的字符串。
    2. stripTrailingZeros()函数就是用于去除末尾多余的0的,
    3. 用toString()方法输出的就是普通的数字字符串。

     

     

     

     

    展开全文
  • 单精度和双精度问题

    2020-08-24 10:46:54
    一,什么是单精度和双精度 单精度数(float)是指计算机...双精度浮点数(double)是计算机使用一种数据类型,使用 64 位(8字节) 来存储一个浮点数。 它可以表示十进制15或16位有效数字,其可以表示的数字绝对值

    一,什么是单精度和双精度

    单精度数(float)是指计算机表达实数近似值的一种方式。VB中Single(单精度浮点型)变量存储为 IEEE 32 位4
    个字节
    )浮点数值的形式,它的范围在负数的时候是从 -3.402823E38 到 -1.401298E-45,而在正数的时候是从
    1.401298E-45 到 3.402823E38 。

    双精度浮点数(double)是计算机使用的一种数据类型,使用 64 位8字节) 来存储一个浮点数。 它可以表示十进制的15或16位有效数字,其可以表示的数字的绝对值范围大约是:2.23x10-308 ~ 1.79x10308。IEEE754为其定制标准。

    扩展:
    单精度和双精度数值类型最早出现在C语言中(比较通用的语言里面),在C语言中单精度类型称为浮点类型(float),顾名思义是通过浮动小数点来实现数据的存储。
    这两个数据类型最早是为了科学计算而产生的,他能够给科学计算提供足够高的精度来存储对于精度要求比较高的数值。
    但是与此同时,他也完全符合科学计算中对于数值的观念:当我们比较两个棍子的长度的时候,一种方法是并排放着比较一下,一种方法是分别量出长度。
    但是事实上世界上并不存在两根完全一样长的棍子,我们测量的长度精度受到人类目测能力和测量工具精度的限制。
    从这个意义上来说,判断两根棍子是否一样长丝毫没有意义,因为结果一定是False,但是我们可以比较他们两个哪个更长或者更短。
    这个例子很好地概括了单精度/双精度数值类型的设计初衷和存在意义。

    二,单精度和双精度有什么区别

    1、单精度和双精度的字节数不同。前者占4个字节;后者占8个字节。

    单精度是这样的格式,1位符号,8位指数,23位小数。单精度表示格式

    双精度是1位符号,11位指数,52位小数。
    双精度表示格式

    2、单精度和双精度有效数字位数不同。前者为8位;后者为16位。

    3、单精度和双精度表示的数的范围不同。前者的数值范围在-3.40E+38 到 +3.40E+38之间;后者的范围为-1.79E+308到+1.79E+308之间。

    4、单精度和双精度处理的速度不同。前者的速度更加的快。

    面试题:

    1.java中3*0.1==0.3将会返回什么?true还是false?

    fale,因为浮点数不能完全精确的表示出来,一般会损失精度。

    2.java中float f = 3.4;是否正确?

    不正确,3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型会造成精度损失,因此需要强制类型转换float
    f = (float)3.4;或者写成 float f = 3.4f;才可以。

    展开全文
  • 在C语言中可以用单精度型和双精度型两种形式表示实型常量,分别用e68a843231313335323631343130323136353331333431376561类型名float和double进行定义。实型常量在一般微型集中占用4个字节,一般形式或者指数形式...

    展开全部

    实型常量又称实数或浮点数。在C语言中可以用单精度型和双精度型两种形式表示实型常量,分别用e68a843231313335323631343130323136353331333431376561类型名float和double进行定义。

    实型常量在一般的微型集中占用4个字节,一般形式或者指数形式,数值范围都是-1038~1038,有效数字是7位。

    浮点型数据又分为单精度型(float)和双精度型(double)两种。

    1、单(float):占用比特数32,有效数位6-7,数值范围(-3.4e-38~3.4e+38)

    2、双(double):占用比特数64,有效数位15-16,数值范围(-1.7e-308~1.7e+308)

    扩展资料

    c语言中,数据类型分为整形、实型和指针类型(以下内容均表示在32位操作系统中):

    其中整形分为char,shortint,longint,longlong,各种类型的使用,前面都可以加上unsigned表示无符号char字符类型,表示的大小为-128~127,大小为一个字节;

    其中0-127被编为ASCⅡ码shortint短整形-65536~655352个字节longint整形-20亿多~20亿多4个字节longlong长整型8个字节longint通常写为int代表的是CPU字长;

    在32为操作系统中cpu的字长是32位,即4个字节实行(浮点型)分为float和double:float6~7位有效数字4个字节double15~16位有效数字8个字节在现代CPU中,有一个协处理器专门进行浮点数的运算;

    然后根据类型进行精度截取指针类型32位无符号整数,即unsignedint,但是它只能表示内存中一个比特的空间的编号注:32位CPU的内存寻址范围是从32个0到32个1,总计4GB,所以,32位操作系统最高只支持4G内存。

    展开全文
  • C#实数类型

    2010-11-22 10:12:00
    双精度:取值范围在正负5.0X10负324到1.7X10308次方之间,精度为15到16位数。 计算机对浮点数运算速度大大低于对整数运算。在对精度要求不是很高浮点计算中,我们可以采用float,而采用doub

    数学中的实数不仅包括整数,而且包括小数。小数在C#中采用两种数据类型来表示:单精度(float)和双精度(double)。它们的差别在于取值范围和精度不同。

    单精度:取值范围在正负1.5X10的负45次方到3.4X10的38次方之间,精度为7位数。
    双精度:取值范围在正负5.0X10的负324到1.7X10的308次方之间,精度为15到16位数。

    计算机对浮点数的运算速度大大低于对整数的运算。在对精度要求不是很高的浮点计算中,我们可以采用float型,而采用double型获得的结果将更为准确。当然,如果在程序中大量使用双精度类浮点数,将会占用更多的内存单元,而且计算机的处理任务也将更加繁重。

    C#还专门为我们定义了一种十进制类型(decimal),主要用于方便我们在金融和货币方面的计算。

    十进制类型是一种高精度、128位数据类型,它所表示的范围从大约1.0X10的负28次方到7.9X10的28次方的28至29位有效数字。注意,该精度是用位数(digits)而不是以小数位(decimal places)来表示的。运算结果准确到28个小数位。十进制类型的取值范围比double类型的范围要小得多,但它更精确。
    当定义一个decimal变量并赋值给它时,使用m下标以表明它是一个十进制类型,如:
    decimal d_value=10.m;
    如果省略了m,在变量被赋值之前,它将被编译器当作双精度(double)类型来处理。

    展开全文
  • C#的实数类型

    2007-12-11 14:19:00
    浮点类型数学中的实数不仅包括整数,而且包括小数。小数在C#中采用两种数据类型来表示:单精度(float)和双精度(double)。...当然,如果在程序中大量使用双精度类浮点数,将会占用更多内存单元,而且计算机处理任
  • 精度计算

    2018-04-03 21:34:50
    我们在用计算机处理的整数和实数的精度通常是有限的,如在双精度的计算机最多只能输出十六位的有效的十进制数,17位的有效数字正确性为0.9(double)如果超出了这个范围,计算机就无法正确表示了。此时就需要借助...
  • 1. ava中原生数据类型共有8种:1)整型:int表示 。32位2)字节:byte表示。...双精度表示范围要比单精度大小数。7)字符:char表示。所谓字符,就是单个字符表示,比如一个字母a,或者中文...
  • Java lesson 3 Pitfall of primitive data type Pitfall of primitive date type 原生数据类型使用陷井 5)单精度浮点:使用flot...双精度浮点要比单数度浮点型的范围大扩. 7)字符:使用char表示(char是c...
  • 7.2为附加格式说明符表示输出宽度占7位并保留两位小数 float单精度型变量和double双精度型变量都可以存储实数两者有何区别 双精度型变量精度更高能存储数值范围更大一般情况下采用单精度型变量就可以了但在处理对...
  • Java记录 -3- 原生数据类型2

    千次阅读 2017-07-01 15:54:46
    Java中原生数据类型共有8种:整型:使用int表示。(32位)字节:使用byte表示。(表示 -128~127之间256个整数,8位)短整型:使用short表示。...双精度浮点型表示的数据范围要比单精度浮点大。字符:使用char
  • 1.java中8种原生数据类型 1)整形:使用int表示 2)字节:使用byte表示 ...6)双精度浮点:使用double表示。双进度浮点型表示的数据范围要比单精度浮点大 7)字符:使用char表示。(char是charact
  • C语言中数据类型&常量

    千次阅读 2015-10-16 21:33:20
    1.整型:用于准确地表示整数,根据表示范围的不同分为以下三种: 短整型(short) 整型(int) 2.实型(浮点):用于标识实数(小数)根据范围和精度不同分为以下两种: 单精度浮点数(float) 双精度浮点数(double) 注意:...
  • java原生数据类型

    2011-05-26 14:04:00
    <br />1) 整型:使用int表示。(32位) 2) 字节:使用byte表示。(表示-128~127之间256个整数, 8位)。...双精度浮点型表示的数据范围要比单精度浮点大。 7)字符:使用char表示(char
  • decimal 使用

    2007-12-21 18:39:00
    数学中的实数不仅包括整数,而且包括小数。小数在C#中采用两种数据类型来表示:单精度(float)和双精度...当然,如果在程序中大量使用双精度类浮点数,将会占用更多内存单元,而且计算机处理任务也将更加繁...
  • vb语言!

    2014-08-22 18:25:54
    数值(Numeric)数据类型 用于处理数值型数据,包括:  整型(Integer)表示整数  长整型(Long)表示整数,但表示的数据范围更大  单精度型(Single)表示带有小数的实数(最多7位有效数字)  双精度型
  • <br />1.Java中原生数据类型共有8种:   1)整型:使用int表示(32位)。 2)字节:使用byte表示表示-128~127之间256个整数)。...双精度浮点型表示的数据范围比单精度浮
  • 实型数据 1:实型常量的表示方法 ...双精度(double)8个字节(64位)数值范围为 {1.7乘以10的—308次方~1.7乘以10的+308次方} 长双精度(long double) 3:实型数据的舍入误差 由于实型变量是由有限的存储单.
  • C语言中采用float和double关键字来定义小数,float称为单精度浮点,double称为双精度浮点,long double更长的双精度浮点。 2、测试double数据类型 C标准规定,double类型必须至少能表示10位有效数字,且取值...
  • C语言中采用float和double关键字来定义小数,float称为单精度浮点,double称为双精度浮点,long double更长的双精度浮点。 2、测试float数据类型 C标准规定,float类型必须至少能表示6位有效数字,且取值范围...
  • python基本数据类型

    2019-02-11 22:52:47
    python浮点遵循IEEE754双精度标准,每个浮点占8个字节,能表示的范围是-1.8308~1.8308 float=2.3; print float; 4、复数:复数由实数和虚数构成,a+bj 5、布尔(逻辑) bool=False...
  • 双精度浮点,十进制浮点,和复数  b,建议用大写字母“L”表示长整数。并且,整型和长整型正在趋向统一。必要时整型会悄悄自动转换为长整型,从而避免数值范围越界为用户带来烦恼。  c,双精度浮点数(类似于c...
  • 2.3 实型数据

    2020-06-23 00:04:27
    双精度型 double (±)1.7E(+/-)308 8字节 不知道叫啥 long double (+/-)1.2E(+/-)4932 16字节 上面数值范围的表示为科学计数法,如 3.4E-22 = 3.4*10-22。 语法: [数据类型] [标识符]; 后面可以接表达式。 ...
  • 其中float为单精度浮点,double为双精度浮点。 1.float C语言规定,float类型必须至少能够表示6位有效数字,且取值范围至少是10^(-37) ~ 10^37. float类型数据表示的是一个近似小数,不是精确地,小数点后n位...
  • java,编辑器

    2021-03-10 11:28:26
    数据类型及相关代码 ...2.浮点类型:浮点类型又称实数类型,实型,用于表示带小数点数据,有单精度和双精度两类,即float和double。 3.字符数据:java语言采用Unicode字符集,即用2字节来储存一个字
  • 双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。 实型变量说明格式和书写规则与整型相同。 例如: float x,y; (x,y为单精度实型量)  double a,b,c; (a,b,c为双精度...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

双精度型实数的表示范围