首先看一段代码:
<?php
$a = 0.1;
$b = 0.7;
var_dump(($a + $b) == 0.8);
打印出来的值居然为 boolean false
这是为啥?PHP手册对于浮点数有以下警告信息:
Warning
浮点数精度
显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999...。
这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333. . .。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数
那么上面的算式我们应该改写为
<?php
$a = 0.1;
$b = 0.7;
var_dump(bcadd($a,$b,2) == 0.8);
这样就能解决浮点数的计算问题了
分享到:
相关推荐
浮点数比较错误
浮点数比较大小.c
消除浮点数比较错误
S7-200SMART_浮点数比较库文件
单片机浮点数设计 单片机浮点数设计 单片机浮点数设计
浮点数运算精度问题 首先看一个例子: <?php $a = 0.1; $b = 0.9; $c = 1; var_dump(($a+$b)==$c); var_dump(($c-$b)==$a); ?> $a+$b==$c 返回true,正确 $c-$b==$a 返回false,错误 为什么会这样呢? 运算后...
单精度浮点数,双精度浮点数,浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。
浮点数结构详细解释,数值计算指南中关于浮点数的一点解释
SMART库_精确浮点数比较real compare.smartlib.rar
浮点数整数转换工具,用于浮点数与整数之间相互转换
近似:近似浮点数相等比较和断言
labview下实现16进制转换浮点数。
C语言浮点数转字符串
浮点数开方rar,浮点数开方
IEEE浮点数工具.rar IEEE浮点数工具,帮助计算IEEE浮点数
labview浮点数读取,可以通过modbus通信直接读写浮点数。
好用的浮点数与二进制转换工具,通讯开发必备实用小工具,4字节浮点数转换,支持正序倒序转换。浮点数转二进制,二进制转浮点数,转换准确。
有些C语言书上说float型的有效位数是6~7位,为什么不是6位或者7位?而是一个变化的6~7位? 浮点数在内存中是如何存放的? float浮点数要比同为4... 如何才能精确比较浮点数真实的大小? 看完本文档,你将会得到答案!
原来一直感觉单片机传送浮点数比较费劲,最近好好弄弄,其实没有那么复杂,不用了解浮点数是怎么存储的,知道占用4个字节就可以了!