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
相关推荐
浮点型数据测试.php 浮点型数据测试 字符串数据测试.php 字符串数据测试 数组数据测试.php 数组数据测试 对象测试.php 对象测试 数据类型识别.php 数据类型识别 强制类型转化.php 强制类型转化 计算圆周面积...
【记账】修复JS浮点运算错误 2.【任务】修复微信端选择人员弹窗 3.【消息】修复查询条件错误。 4.【任务】修复由我处理中变量错误 5.【审批】修复编辑审批是审批编号显示错误。 6.【任务】文字分配...
8. PHP与前端技术的结合:包括使用Composer管理依赖、配合JavaScript框架(如Vue.js、React.js)进行前后端分离开发。 这套资料不仅适合PHP初学者巩固基础,也对有一定经验的开发者在面试准备和技能提升上有很大...
PHP内置丰富的数据类型(如整型、浮点型、字符串、数组、对象等),并提供了大量的预定义函数,涵盖了字符串操作、数学运算、文件系统处理、日期时间处理、数据库连接等常见功能,极大提高了开发效率。 在Web开发中...
首先,手册中的核心知识点包括PHP的基本语法,如变量声明、数据类型(字符串、整型、浮点型、布尔型、数组、对象、NULL等)、运算符(算术、比较、逻辑、位运算、赋值等)以及流程控制(条件语句、循环结构、异常...
《PHP从入门到精通(第3版)》是明日科技出版的一本专为初学者和进阶者设计的PHP编程教程。PHP作为一种广泛应用于Web开发的服务器端脚本语言,其学习过程涵盖了大量的知识点和技能。以下是根据标题、描述以及书籍内容...
变量以$符号开头,如 `$variable`,支持多种数据类型,包括整型、浮点型、字符串、布尔型、数组、对象、NULL和资源等。此外,PHP还支持弱类型转换,使得在不同数据类型间转换更为灵活。 二、流程控制与逻辑运算 ...
1. **变量和数据类型**:PHP支持多种数据类型,如整型、浮点型、字符串、布尔型、数组、对象、NULL和资源等。手册详细阐述了每种类型的使用方法和特性。 2. **流程控制**:包括条件语句(if、else、switch)、循环...
本项目采 用PHP+mysql有以及html+css jq以及layer.js datatables bootstorap等插件等开发,采用了MVC模式,建立一个完善的电商系统,通过不同用户的不同需求,进行相应的调配和处理,提高对购买用户进行配置… ...
1. **语法与结构**:PHP的基础包括变量定义、数据类型(如整型、浮点型、字符串、数组等)、控制结构(if/else、switch、for、while循环)和函数定义。 2. **预处理指令**:使用`<?php` 和 `?>` 标签将PHP代码嵌入到...
利用html+css+js作为前端语言和php作为后台语言,采用前端与后台分离的设计方式,主要实现新用户注册,用户登录,发微博(包括文字,表情,音乐,视频),评论微博,转发微博,关注用户,私信等功能。 PHP(全称:...
- **精度问题**:浮点运算可能遇到精度损失问题。 ##### 3.9 PHP数据类型自动转换 - **示例**:将字符串`"123"`自动转换为整型`123`。 - **转换规则**:根据上下文自动进行转换。 ##### 3.10 表达式 - **定义**:...
15. **Ajax异步请求**:结合JavaScript和PHP,学习使用Ajax进行页面无刷新的数据交换。 通过《PHP程序设计经典300例源代码》的学习,你可以深入理解PHP的各个层面,并通过实践提升编程能力,为构建动态、交互性强的...
PHP支持多种数据类型,包括整型、浮点型、字符串、数组、对象、资源和NULL。 **8. 运算符** PHP运算符包括算术运算符、比较运算符、逻辑运算符、位运算符、赋值运算符等。 **9. 函数** PHP拥有大量的内置函数,...
3. **数据类型**:PHP支持多种数据类型,包括字符串、整型、浮点型、布尔型、数组、对象、NULL和资源等。 4. **流程控制**:PHP提供了if/else、switch、for、while等条件判断和循环结构,用于控制程序执行流程。 ##...
1. **基础语法**:PHP的基础语法包括变量定义、数据类型(如字符串、整型、浮点型、数组、布尔型、NULL)、操作符(算术、比较、逻辑、位运算等)、流程控制(条件语句、循环结构、异常处理)以及函数的使用。...
此外,还支持递增(++)和递减(--)运算。 示例: ```php $a = 10; $b = 5; $c = $a + $b; // 加法 $d = $a - $b; // 减法 $e = $a * $b; // 乘法 $f = $a / $b; // 除法 $g = $a % $b; // 取模 ``` **3.2 字符串...
2. **PHP基本语法**:讲解PHP的注释、变量、数据类型(如整型、浮点型、字符串、布尔型、数组和NULL)、常量、运算符(算术、比较、逻辑、字符串、位运算等)以及流程控制(条件语句、循环结构如if、switch、for、...
5. **AJAX(Asynchronous JavaScript and XML)**:结合JavaScript和PHP,实现页面无刷新更新,提高用户体验。 6. **框架**:如Laravel、Symfony、Yii等PHP框架,提供快速开发、代码结构和最佳实践。 7. **PHP与...
【记账】修复JS浮点运算错误2.【任务】修复微信端选择人员弹窗3.【消息】修复查询条件错误。4.【任务】修复由我处理中变量错误5.【审批】修复编辑审批是审批编号显示错误。6.【任务】文字分配改成指派7.【自定义空间...