精华内容
下载资源
问答
  • PHP浮点数是什么大家知道PHP浮点数是什么吗?下面我们就给大家详细介绍一下吧!PHP是一种弱类型语言, 这样的特性, 必然要求有无缝透明的隐式类型转换, PHP内部使用zval来保存任意类型的数值, zval的结构如下(5.2为例):...

    PHP浮点数是什么

    大家知道PHP浮点数是什么吗?下面我们就给大家详细介绍一下吧!PHP是一种弱类型语言, 这样的特性, 必然要求有无缝透明的隐式类型转换, PHP内部使用zval来保存任意类型的数值, zval的结构如下(5.2为例):

    代码如下:

    struct _zval_struct {

    /* Variable information */

    zvalue_value value; /* value */

    zend_uint refcount;

    zend_uchar type; /* active type */

    zend_uchar is_ref;

    };

    上面的结构中, 实际保存数值本身的是zvalue_value联合体:

    代码如下:

    typedef union _zvalue_value {

    long lval; /* long value */

    double dval; /* double value */

    struct {

    char *val;

    int len;

    } str;

    HashTable *ht; /* hash table value */

    zend_object_value obj;

    } zvalue_value;

    今天的话题, 我们只关注其中的俩个成员, lval和dval, 我们要意识到, long lval是随着编译器, OS的字长不同而不定长的, 它有可能是32bits或者64bits, 而double dval(双精度)由IEEE 754规定, 是定长的, 一定是64bits.

    请记住这一点, 造就了PHP的一些代码的”非平台无关性”. 我们接下来的讨论, 除了特别指明, 都是假设long为64bits

    IEEE 754的浮点计数法, 这里就不引用了, 大家有兴趣的可以自己查看, 关键的一点是, double的尾数采用52位bit来保存, 算上隐藏的1位有效位, 一共是53bits.

    在这里, 引出一个很有意思的问题, 我们用c代码举例(假设long为64bits):

    代码如下:

    long a = x;

    assert(a == (long)(double)a);

    请问, a的取值在什么范围内的时候, 上面的代码可以断言成功?(留在文章最后解答)

    现在我们回归正题, PHP在执行一个脚本之前, 首先需要读入脚本, 分析脚本, 这个过程中也包含着, 对脚本中的字面量进行zval化, 比如对于如下脚本:

    代码如下:

    $a = 9223372036854775807; //64位有符号数最大值

    $b = 9223372036854775808; //最大值+1

    var_dump($a);

    var_dump($b);

    输出:

    代码如下:

    int(9223372036854775807)

    float(9.22337203685E+18)

    也就说, PHP在词法分析阶段, 对于一个字面量的数值, 会去判断, 是否超出了当前系统的long的表值范围, 如果不是, 则用lval来保存, zval为IS_LONG, 否则就用dval表示, zval IS_FLOAT.

    凡是大于最大的整数值的数值, 我们都要小心, 因为它可能会有精度损失:

    代码如下:

    $a = 9223372036854775807;

    $b = 9223372036854775808;

    var_dump($a === ($b - 1));

    输出是false.

    现在接上开头的讨论, 之前说过, PHP的整数, 可能是32位, 也可能是64位, 那么就决定了, 一些在64位上可以运行正常的代码, 可能会因为隐形的类型转换, 发生精度丢失, 从而造成代码不能正常的运行在32位系统上.

    所以, 我们一定要警惕这个临界值, 好在PHP中已经定义了这个临界值:

    代码如下:

    echo PHP_INT_MAX;

    ?>

    当然, 为了保险起见, 我们应该使用字符串来保存大整数, 并且采用比如bcmath这样的数学函数库来进行计算.

    另外, 还有一个关键的配置, 会让我们产生迷惑, 这个配置就是php.precision, 这配置决定了PHP再输出一个float值的时候, 输出多少有效位.

    最后, 我们再来回头看上面提出的'问题, 也就是一个long的整数, 最大的值是多少, 才能保证转到float以后再转回long不会发生精度丢失?

    比如, 对于整数, 我们知道它的二进制表示是, 101, 现在, 让我们右移俩位, 变成1.01, 舍去高位的隐含有效位1, 我们得到在double中存储5的二进制数值为:

    代码如下:

    0/*符号位*/ 10000000001/*指数位*/ 0100000000000000000000000000000000000000000000000000

    5的二进制表示, 丝毫未损的保存在了尾数部分, 这个情况下, 从double转会回long, 不会发生精度丢失.

    我们知道double用52位表示尾数, 算上隐含的首位1, 一共是53位精度.. 那么也就可以得出, 如果一个long的整数, 值小于:

    代码如下:

    2^53 - 1 == 9007199254740991; //牢记, 我们现在假设是64bits的long

    那么, 这个整数, 在发生long->double->long的数值转换时, 不会发生精度丢失.

    展开全文
  • 《PHP浮点数是什么》由会员分享,可在线阅读,更多相关《PHP浮点数是什么(3页珍藏版)》请在装配图网上搜索。1、PHP浮点数是什么PHP浮点数是什么大家知道PHP浮点数是什么吗下面我们就给大家详细介绍一下吧PHP是一种弱...

    《PHP浮点数是什么》由会员分享,可在线阅读,更多相关《PHP浮点数是什么(3页珍藏版)》请在装配图网上搜索。

    1、PHP浮点数是什么PHP浮点数是什么大家知道PHP浮点数是什么吗下面我们就给大家详细介绍一下吧PHP是一种弱类型语言, 这样的特性, 必然要求有无缝透明的隐式类型转换, PHP内部使用zval来保存任意类型的数值, zval的结构如下5.2为例代码如下struct _zval_struct /* Variable ination */zvalue_value value; /* value */zend_uint refcount;zend_uchar type; /* active type */zend_uchar is_ref上面的结构中, 实际保存数值本身的是zvalue_value联。

    2、合体代码如下typedef union _zvalue_value long lval; /* long value */double dval; /* double value */struct char *val;int len; str;HashTable *ht; /* hash table value */zend_object_value obj; zvalue_value;今天的话题, 我们只关注其中的俩个成员, lval和dval, 我们要意识到, long lval是随着编译器, OS的字长不同而不定长的, 它有可能是32bits或者64bits, 而double dval双。

    3、精度由IEEE 754规定, 是定长的, 一定是64bits.请记住这一点, 造就了PHP的一些代码的”非平台无关性”. 我们接下来的讨论, 除了特别指明, 都是假设long为64bitsIEEE 754的浮点计数法, 这里就不引用了, 大家有兴趣的可以自己查看, 关键的一点是, double的尾数采用52位bit来保存, 算上隐藏的1位有效位, 一共是53bits.在这里, 引出一个很有意思的问题, 我们用c代码举例假设long为64bits代码如下long a x;asserta longdoublea;请问, a的取值在什么范围内的时候, 上面的代码可以断言成功留在文章最后解答现在我们。

    4、回归正题, PHP在执行一个脚本之前, 首先需要读入脚本, 分析脚本, 这个过程中也包含着, 对脚本中的字面量进行zval化, 比如对于如下脚本代码如下a 9223372036854775807; 64位有符号数最大值b 9223372036854775808; 最大值1var_dumpa;var_dumpb;输出代码如下int9223372036854775807float9.22337203685E18也就说, PHP在词法分析阶段, 对于一个字面量的数值, 会去判断, 是否超出了当前系统的long的表值范围, 如果不是, 则用lval来保存, zval为IS_LONG, 否则就用dv。

    5、al表示, zval IS_FLOAT.凡是大于最大的整数值的数值, 我们都要小心, 因为它可能会有精度损失代码如下a 9223372036854775807;b 9223372036854775808;var_dumpa b - 1;输出是false.现在接上开头的讨论, 之前说过, PHP的整数, 可能是32位, 也可能是64位, 那么就决定了, 一些在64位上可以运行正常的代码, 可能会因为隐形的类型转换, 发生精度丢失, 从而造成代码不能正常的运行在32位系统上.所以, 我们一定要警惕这个临界值, 好在PHP中已经定义了这个临界值代码如下echo PHP_INT_MAX;当然, 。

    6、为了保险起见, 我们应该使用字符串来保存大整数, 并且采用比如bcmath这样的数学函数库来进行计算.另外, 还有一个关键的配置, 会让我们产生迷惑, 这个配置就是php.precision, 这配置决定了PHP再输出一个float值的时候, 输出多少有效位.最后, 我们再来回头看上面提出的问题, 也就是一个long的整数, 最大的值是多少, 才能保证转到float以后再转回long不会发生精度丢失比如, 对于整数, 我们知道它的二进制表示是, 101, 现在, 让我们右移俩位, 变成1.01, 舍去高位的隐含有效位1, 我们得到在double中存储5的二进制数值为代码如下0/*符号位*/ 10000000001/*指数位*/ 01000000000000000000000000000000000000000000000000005的二进制表示, 丝毫未损的保存在了尾数部分, 这个情况下, 从double转会回long, 不会发生精度丢失.我们知道double用52位表示尾数, 算上隐含的首位1, 一共是53位精度 那么也就可以得出, 如果一个long的整数, 值小于代码如下253 - 1 9007199254740991; 牢记, 我们现在假设是64bits的long那么, 这个整数, 在发生long-double-long的数值转换时, 不会发生精度丢失.。

    展开全文
  • 浮点数什么不精确

    千次阅读 多人点赞 2019-08-17 01:52:13
    浮点数什么不精确? 其实这句话本身就不精确, 相对精确一点的说法: 我们在程序里写的 10 进制小数,计算机内部无法用二进制的小数来精确的表达。 因为二进制只能表示 2 的 n 次方的数,n 可以取负值,3.3 无法...

    浮点数为什么不精确?

    其实这句话本身就不精确, 相对精确一点的说法是: 我们在程序里写的 10 进制小数,计算机内部无法用二进制的小数来精确的表达。

    因为二进制只能表示 2 的 n 次方的数,n 可以取负值,3.3 无法用 2 的 n 次方的数组合计算出来,所以无法精确表示:
    3.3 = 1*2+1*1+0*1/2+1*1/4+0*1/8+0*1/16+1*1/32+…
    (解释:2+1=3,3+1/2>3.3 所以系数是 0)
    其中分式的分母只能是 2 的倍数(二进制所限),3.3 的二进制表示是 11.01001…
    有些数比如 1/3 就无法精确计算,只能无限逼近

    再比如表达十进制的 0.2
    0.01 = 1/4 = 0.25 ,太大
    0.001 =1/8 = 0.125 , 又太小
    0.0011 = 1/8 + 1/16 = 0.1875 , 逼近0.2了
    0.00111 = 1/8 + 1/16 + 1/32 = 0.21875 , 又大了
    0.001101 = 1/8+ 1/16 + 1/64 = 0.203125 还是大
    0.0011001 = 1/8 + 1/16 + 1/128 = 0.1953125 这结果不错
    0.00110011 = 1/8+1/16+1/128+1/256 = 0.19921875
    已经很逼近了, 就这样吧。

    相关文章:
    不能使用 float 和 double 来表示金额等精确的值

    展开全文
  • 本文就带各位温顾温顾java浮点型、单精度浮点数、双精度浮点数。浮点型首先明确java中浮点型数据类型主要有:单精度float、双精度double至于浮点型就是跟int ,string类型差不多。都数据类型。浮点型浮点型别给我...

    前言

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

    浮点型

    首先明确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~

    14cb1b08bc97a01064ac06b83e616fb9.png 想深入了解浮点数在计算机中存储方式可以参考这篇文章 浮点数在计算机中存储方式

    最后,欢迎各位关注我的公众号,一起探讨技术,向往技术,追求技术,说好了来了就是盆友喔...

    展开全文
  • 本文就带各位温顾温顾java浮点型、单精度浮点数、双精度浮点数。浮点型首先明确java中浮点型数据类型主要有:单精度float、双精度double至于浮点型就是跟int ,string类型差不多。都数据类型。浮点型浮点型别给我...
  • 本文就带各位温顾温顾java浮点型、单精度浮点数、双精度浮点数。浮点型首先明确java中浮点型数据类型主要有:单精度float、双精度double至于浮点型就是跟int ,string类型差不多。都数据类型。浮点型浮点型别给我...
  • 什么是浮点数

    2021-01-23 13:36:24
    微信搜索关注「水滴与银弹」公众号,第一时间获取优质技术干货。7年资深后端研发,用简单的方式把技术讲清楚。 在上一篇文章中,我们主要介绍了在计算机中使用定点数表示数字的方式。...什么是浮.
  • 什么是浮点数

    2019-07-21 08:48:00
    对于以上结果的分析,为什么int和flaot同样4个字节,表示的返回会不一样呢? 因为int的每一位都数据位,4个字节,32位,一位当做符号位,其他都有效的数据位,有限的32位只能表示2147483647。 而float ...
  • 本文就带各位温顾温顾java浮点型、单精度浮点数、双精度浮点数。浮点型首先明确java中浮点型数据类型主要有:单精度float、双精度double至于浮点型就是跟int ,string类型差不多。都数据类型。浮点型浮点型别给我...
  • 展开全部并不java的浮点数精度会丢失,而是所有用二进制存e69da5e6ba903231313335323631343130323136353331333365643662储中的浮点数都可能会精度丢失(部分特殊的小数数值可以精确表示),所以计算机中存储的浮点数...
  • 之所以会出现本不能精确表示的浮点数在打印出来后反而精确的,因为在将其转换为字符串的过程中,Java耍了点小聪明。它会将看起来疑似“整”的浮点数进行特殊处理,转换为那个“整”的十进制小数形式。举个例子...
  • 浮点数是指用符号、尾数、基数和指数来表示的小数: 如图:  因为计算机内部使用的是二进制数,所以基数已经确定,实际数据中往往并不考虑基数,只用符号、尾数、指数这三个部分即可表示浮点数。  像0.12345...
  • 01100111011011000110111101100010 表示浮点数什么是1.116533*10^24?
  • 本文就带各位温顾温顾java浮点型、单精度浮点数、双精度浮点数。浮点型首先明确java中浮点型数据类型主要有:单精度float、双精度double至于浮点型就是跟int ,string类型差不多。都数据类型。浮点型浮点型别给我...
  • 浮点数什么不精确?

    千次阅读 2018-11-22 16:26:56
    浮点数什么不精确? 其实这句话本身就不精确, 相对精确一点的说法: 我们码农在程序里写的10进制小数,计算机内部无法用二进制的小数来精确的表达。 什么是二进制的小数? 就是形如 101.11 数字,注意,这...
  • 浮点数是用补码的方法进行减法运算的吗? 若是,那么他是怎么算的,浮点数中存在着阶码,转为补码的时候,阶码也要跟着反码加一之类的吗? 若不是,那么他是怎么进行运算的?
  • 浮点数什么不精确? 其实这句话本身就不精确, 相对精确一点的说法: 我们码农在程序里写的10进制小数,计算机内部无法用二进制的小数来精确的表达。 什么是二进制的小数? 就是形如 101.11 数字,注意,这...
  • 浮点数与移码

    2020-12-18 17:36:07
    浮点数的组成和计数原理浮点数浮点数是什么浮点数的组成浮点数的计算2.读入数据总结 浮点数 浮点数是什么 浮点数的组成 浮点数的计算 代码如下(示例): import numpy as np import pandas as pd import matplotlib...
  • 浮点数什么不能用“==”比较

    千次阅读 2019-10-24 17:32:25
    本文尝试着将以下内容做一个浅显的解释,主要包括浮点数什么是不精确的,浮点数什么不能用==和!=直接比较,以及浮点数的比较方法等几个方面。如果那个地方说的不对还请各位看官不吝赐教!欢迎大家评论区讨论。 ...
  • 新生自学JAVA,今天看到JAVA取整会有近似,想知道为什么会导致这样的问题
  • 如题所问,就是知道可以用一组数组来表示 那现在最新的对浮点数的处理如何处理的呢?因为还是学生,可能课本学到的不是应用的最前端,所以想问问现在怎样的,谢谢啦~
  • 这和浮点数的表示方式有关系。由于浮点数的表示方法的缘故,十进制的小数部分并不是和二进制一一对应的。对于一个整数,计算机可以找到一个精确的二进制值去表示。而对于很多小数,计算机不能完全精准表示的,只能...
  • 浮点数

    2019-08-29 09:58:59
    1.为什么要引入浮点数 长整型最大922亿亿,需要表示更大的数字,所以引入浮点数 2.单精度浮点数的格式 A.符号位:由于浮点数不能表示0,所以要分正负区间,0正1负 B.阶码位: a.存储的原数据的移码,由于...
  • 本文就带各位温顾温顾java浮点型、单精度浮点数、双精度浮点数。 浮点型 浮点型浮点型别给我整些花里胡哨的定义,浮点型简单来说就是表示带有小数的数据,而恰恰小数点可以在相应的二进制的不同位置浮动,可能...
  • 1.引言float和double类型的主要设计目标为了科学计算和工程计算。他们执行二进制浮点运算,这为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被...
  • 在上一篇文章:什么是定点数?我们主要介绍了在计算机中使用定点数表示数字的方式。简单回顾一下,简单来说,用定点数表示数字时,会约定小数点的位置固定不变,整数部分和小数部分分别转换为二进制,就是定点数的...
  • 计算机中存储的浮点数什么会产生误差 计算机只能存储二进制0、1,这人所共知的。 浮点数在计算机中存储时,小数部分也按二进制存储的; 例如: 0.9 十进制转换为二进制: 0.111001100110011001100…无限循环...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,665
精华内容 1,466
关键字:

浮点数是什么