首页  >  文章  >  后端开发  >  有关 PHP 和 js 浮点运算的问题

有关 PHP 和 js 浮点运算的问题

一个新手
一个新手原创
2017-10-12 09:15:081233浏览

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。

有关 PHP 和 js 浮点运算的问题

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

有关 PHP 和 js 浮点运算的问题

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

前面说过,1≤M0e895a4342722933aba05d0b89f9b5d0

以上是有关 PHP 和 js 浮点运算的问题的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn