Heim >Backend-Entwicklung >PHP-Tutorial >php浮点数除法问题

php浮点数除法问题

WBOY
WBOYOriginal
2016-06-06 20:29:342357Durchsuche

在php代码里有一个变量(假如是$a)的值是80,然后我让这个变量除以100($a/100),结果是0.80000000000000004,不知道是啥道理。请各位知晓的朋友说下,谢谢。

回复内容:

在php代码里有一个变量(假如是$a)的值是80,然后我让这个变量除以100($a/100),结果是0.80000000000000004,不知道是啥道理。请各位知晓的朋友说下,谢谢。

http://php.net/manual/zh/language.types.float.php
以十进制能够精确表示的有理数如0.1或0.7,无论有多少尾数都不能被内部所使用的二进制精确表示.
因此不能在不丢失一点点精度的情况下转换为二进制的格式.
这就会造成混乱的结果,例如 floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8.
因为该结果内部的表示其实是类似 7.9999999999999991118...
永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等.
如果确实需要更高的精度,应该使用bcmath(Binary Calculator Math)函数或者gmp(GNU Multiple Precision)函数.
http://php.net/manual/zh/ref.bc.php
http://php.net/manual/zh/ref.gmp.php

为了保险起见,数据库应该使用字符串来保存大整数,并且采用比如bcmath这样的数学函数库来进行计算.
http://php.net/manual/zh/language.types.integer.php
比如用PHP对账户余额进行计算时,可以使用bcmath系列任意精度数学计算函数.
加 bcadd
减 bcsub
乘 bcmul
除 bcdiv
乘方 bcpow
开平方根 bcsqrt
比较 bccomp
取模(求余数) bcmod
设置默认精度 bcscale

这不只是PHP存在,几乎所有的程序设计语言都存在这个问题,因为计算机的CPU是用二进制在完成计算工作,而二进制无法精确地表示大部分十进制的小数。具体解释可以看这个 http://www.cnblogs.com/nobel/archive/2013/04/08/3009162.html

去谷歌一下计算机是如何处理浮点数就知道了~

做个测试吧。
打开chrome的调试模式,在console里面输入0.2+0.4
你看下chrome给你的结果。

这个设计到二进制精度计算的问题。

0.1 到 0.9 的 9 个小数中,只有 0.5 可以用二进制精确的表示。

这里有人对此有过研究,看这里

我当时也是看这篇文章才理解的http://www.laruence.com/2013/03/26/2884.html

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn