`
wyk86485480
  • 浏览: 29127 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
文章分类
社区版块
存档分类
最新评论

有关 PHP 和 js 浮点运算的坑

PHP 
阅读更多

javascript

0.1 + 0.2 为啥不等于 0.3 ? (正确结果:0.30000000000000004)

0.8 * 7 为啥不等于 5.6 ? (正确结果:5.6000000000000005)

PHP

var_dump(intval(0.58 * 100));

正确结果是 57,而不是 58

浮点运算惹的祸

其实这些结果都并非语言的 bug,但和语言的实现原理有关, js 所有数字统一为 Number, 包括整形实际上全都是双精度(double)类型。

而PHP会区分 int 还是 float。不管什么语言,只要涉及浮点运算,都是存在类似的问题,使用时一定要注意。

浮点二进制原理

根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:

V = (-1)s * M * E

    1. (-1)s 表示符号位,当s=0,V为正数;当s=1,V为负数。
    2. M表示有效数字,大于等于1,小于2。
    3. 2E 表示指数位。

 举例来说:十进制的-5.0,写成二进制是-101.0,相当于-1.01×22 。那么,s=1,M=1.01,E=2。

IEEE 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。

对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

IEEE 754对有效数字M和指数E,还有一些特别规定。

前面说过,1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机 内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只 保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给 M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。

至于指数E,情况就比较复杂。

首先,E为一个无符号整数(unsigned int)。这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它 的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,E的真实值必须 由E再减去一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。
比如,210 的E是10,所以保存成32位浮点数时,必须保存成10(E的真实值)+127=137(E),即10001001。

然后,指数E还可以再分成三种情况:
(1)E不全为0或不全为1。这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023),得到真实 值,再将有效数字M前加上第一位的1。
(2)E全为0。这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为 0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
(3)E全为1。这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示 这个数不是一个数(NaN)。>

参考

http://www.laruence.com/2013/03/26/2884.html
http://www.cnblogs.com/qlwy/archive/2012/08/17/2644470.html

 

转自:http://www.yinqisen.cn/blog-782.html

 
分享到:
评论

相关推荐

    精通正则表达式基于.NET ASP PHP JSP JavaScript

    浮点型数据测试.php 浮点型数据测试 字符串数据测试.php 字符串数据测试 数组数据测试.php 数组数据测试 对象测试.php 对象测试 数据类型识别.php 数据类型识别 强制类型转化.php 强制类型转化 计算圆周面积...

    小微开源 PHP OA办公系统 V2.0.rar

    【记账】修复JS浮点运算错误  2.【任务】修复微信端选择人员弹窗  3.【消息】修复查询条件错误。  4.【任务】修复由我处理中变量错误  5.【审批】修复编辑审批是审批编号显示错误。  6.【任务】文字分配...

    韩顺平老师PHP面试题大全上卷基础篇+下卷高级篇有答案

    8. PHP与前端技术的结合:包括使用Composer管理依赖、配合JavaScript框架(如Vue.js、React.js)进行前后端分离开发。 这套资料不仅适合PHP初学者巩固基础,也对有一定经验的开发者在面试准备和技能提升上有很大...

    PHP+HTML+CSS+Javascript+MySQL的网页留言板.zip

    PHP内置丰富的数据类型(如整型、浮点型、字符串、数组、对象等),并提供了大量的预定义函数,涵盖了字符串操作、数学运算、文件系统处理、日期时间处理、数据库连接等常见功能,极大提高了开发效率。 在Web开发中...

    PHP 中文手册 官方2016

    首先,手册中的核心知识点包括PHP的基本语法,如变量声明、数据类型(字符串、整型、浮点型、布尔型、数组、对象、NULL等)、运算符(算术、比较、逻辑、位运算、赋值等)以及流程控制(条件语句、循环结构、异常...

    PHP从入门到精通(第3版)》.(明日科技)

    《PHP从入门到精通(第3版)》是明日科技出版的一本专为初学者和进阶者设计的PHP编程教程。PHP作为一种广泛应用于Web开发的服务器端脚本语言,其学习过程涵盖了大量的知识点和技能。以下是根据标题、描述以及书籍内容...

    php中文参考手册 超级全面

    变量以$符号开头,如 `$variable`,支持多种数据类型,包括整型、浮点型、字符串、布尔型、数组、对象、NULL和资源等。此外,PHP还支持弱类型转换,使得在不同数据类型间转换更为灵活。 二、流程控制与逻辑运算 ...

    PHP参考手册(中英文均有)

    1. **变量和数据类型**:PHP支持多种数据类型,如整型、浮点型、字符串、布尔型、数组、对象、NULL和资源等。手册详细阐述了每种类型的使用方法和特性。 2. **流程控制**:包括条件语句(if、else、switch)、循环...

    PHP+mysql 这是一个自主开发的购物商城.zip

    本项目采 用PHP+mysql有以及html+css jq以及layer.js datatables bootstorap等插件等开发,采用了MVC模式,建立一个完善的电商系统,通过不同用户的不同需求,进行相应的调配和处理,提高对购买用户进行配置… ...

    牛人的PHP学习总结笔记

    1. **语法与结构**:PHP的基础包括变量定义、数据类型(如整型、浮点型、字符串、数组等)、控制结构(if/else、switch、for、while循环)和函数定义。 2. **预处理指令**:使用`&lt;?php` 和 `?&gt;` 标签将PHP代码嵌入到...

    兄弟连PHP视频教程下载地址-18.1.191

    第三章深入PHP基本语法,内容包括PHP的功能概述,编写第一个PHP程序,语言标记和指令分隔符的使用,变量的存储、声明和命名,可变变量和引用变量的概念,各种数据类型(如布尔型、整型、浮点型、字符串)的介绍,...

    html+css+js 简易微博系统.zip

    利用html+css+js作为前端语言和php作为后台语言,采用前端与后台分离的设计方式,主要实现新用户注册,用户登录,发微博(包括文字,表情,音乐,视频),评论微博,转发微博,关注用户,私信等功能。 PHP(全称:...

    PHP+Mysql开发入门

    - **精度问题**:浮点运算可能遇到精度损失问题。 ##### 3.9 PHP数据类型自动转换 - **示例**:将字符串`"123"`自动转换为整型`123`。 - **转换规则**:根据上下文自动进行转换。 ##### 3.10 表达式 - **定义**:...

    PHP程序设计经典300例源代码

    15. **Ajax异步请求**:结合JavaScript和PHP,学习使用Ajax进行页面无刷新的数据交换。 通过《PHP程序设计经典300例源代码》的学习,你可以深入理解PHP的各个层面,并通过实践提升编程能力,为构建动态、交互性强的...

    PHP入门教程CHM格式

    3. **数据类型**:PHP支持多种数据类型,包括字符串、整型、浮点型、布尔型、数组、对象、NULL和资源等。 4. **流程控制**:PHP提供了if/else、switch、for、while等条件判断和循环结构,用于控制程序执行流程。 ##...

    PHP 英文帮助手册

    1. **基础语法**:PHP的基础语法包括变量定义、数据类型(如字符串、整型、浮点型、数组、布尔型、NULL)、操作符(算术、比较、逻辑、位运算等)、流程控制(条件语句、循环结构、异常处理)以及函数的使用。...

    PHP教程:快速学习PHP

    此外,还支持递增(++)和递减(--)运算。 示例: ```php $a = 10; $b = 5; $c = $a + $b; // 加法 $d = $a - $b; // 减法 $e = $a * $b; // 乘法 $f = $a / $b; // 除法 $g = $a % $b; // 取模 ``` **3.2 字符串...

    PHP编程基础与实例教程课件

    2. **PHP基本语法**:讲解PHP的注释、变量、数据类型(如整型、浮点型、字符串、布尔型、数组和NULL)、常量、运算符(算术、比较、逻辑、字符串、位运算等)以及流程控制(条件语句、循环结构如if、switch、for、...

    从入门到精通(PHP)

    5. **AJAX(Asynchronous JavaScript and XML)**:结合JavaScript和PHP,实现页面无刷新更新,提高用户体验。 6. **框架**:如Laravel、Symfony、Yii等PHP框架,提供快速开发、代码结构和最佳实践。 7. **PHP与...

    小微OA v2.0

    【记账】修复JS浮点运算错误2.【任务】修复微信端选择人员弹窗3.【消息】修复查询条件错误。4.【任务】修复由我处理中变量错误5.【审批】修复编辑审批是审批编号显示错误。6.【任务】文字分配改成指派7.【自定义空间...

Global site tag (gtag.js) - Google Analytics