

PHP float浮点数的精度问题
source link: https://abcdxyzk.github.io/blog/2023/07/16/lang-php-float/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

PHP float浮点数的精度问题
2023-07-16 07:51:00
https://blog.csdn.net/cr27225/article/details/118603543
https://www.cnblogs.com/phpfensi/p/8143367.html
$a = 2586;
$b = 2585.98;
var_dump($a-$b);
期望的结果是:float(0.02)
实际结果:float(0.019999999999982)
浮点数的精度有限。尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。
此外,以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。
这就会造成混乱的结果:例如,floor((0.1+0.7)*10)
通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118…
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。
bc函数:
bcadd — 两个任意精度数字的加法计算
bccomp — 比较两个任意精度的数字
bcdiv — 两个任意精度的数字除法计算
bcmod — 任意精度数字取模
bcmul — 两个任意精度数字乘法计算
bcpow — 任意精度数字的乘方
bcpowmod — Raise an arbitrary precision number to another, reduced by a specified modulus
bcscale — 设置/获取所有 bc math 函数的默认小数点保留位数
bcsqrt — 任意精度数字的二次方根
bcsub — 两个任意精度数字的减法
Posted by kk
2023-07-16 07:51:00language, php
« Firefox报NS_BINDING_ABORTED错误 JS 获取 URL参数 »


Recommend
-
98
最近在做项目的时候,涉及到商品价格的计算,经常会出现计算出现精度问题。刚开始草草了事,直接用toFixed就解决了问题,并没有好好的思考一下这个问题。后来慢慢的,问题越来越多,连toFixed也出现了(允悲),后来经过搜索网上的各种博客和论坛,整理总结了一下...
-
48
在知乎上上看到如下问题: 浮点数精度问题的前世今生 ? 1.该问题出现的原因 ? 2.为何其他编程语言,比如java中可能没有js那么明显 3....
-
47
写在前面 最近工作中遇到两例mysql时间戳相关的问题,一个是mysql-connector-java和msyql的精度不一致导致数据查不到;另一例是应用服务器时区错误导致数据查询不到。 通过这篇文章,希望能够解答关于mysql中时间戳的几...
-
13
Unity3D研究院之被坑了的浮点数的精度(一百零三) 最近被浮点数坑了,所以一定要写篇文章记录下。先看看如下代码
-
14
我是架构精进之路,点击上方“关注”,坚持每天为你分享技术干货,私信我回复“01”,送你一份程序员成长进阶大礼包。
-
7
PHP浮点数的一个常见问题的解答 本文地址: https://www.laruence.com/2013/03/26/2884.html 转载请注明出处 ...
-
11
卖家今天做广告推广,新增曝光率 1000,商品总曝光量达 11500,很高兴,上平台一看,显示 1.1 w 曝光率,很疑惑,按四舍五入计算,也应该是 1.2w 才对吧,怎么回事呢?通过排查发现是 JS 的 toFixed 的 bug。2 toFixed 是什...
-
5
浮点数计算时有个很常见的精度case是0.1+0.2!=0.3,网络上有很多文章剖析了为啥0.1+0.2!=0.3,然后给出了解决方案:将各个浮点数乘以一个高倍数再进行计算,或者判断差值小于一个值,就可以了。确实,0.1*1000+0.2*1000=...
-
6
本文链接:https://www.cnblogs.com/snoopy1866/p/16021137.html 1 数值存储方式 SAS使用8个字节存储数值,使用浮点计数法表示数值。 浮点计数法由4...
-
3
V2EX › Bash shell 比较浮点数大小的问题,顺便吐槽以下 shell
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK