Heim  >  Artikel  >  Backend-Entwicklung  >  PHP的floor函数问题。

PHP的floor函数问题。

WBOY
WBOYOriginal
2016-08-08 09:31:091545Durchsuche



最近在写一个有关金融的项目。里面涉及到好多资金小数的问题。有一次用到floor想实现向下取整精确到两位小数时,突然发现如下代码不正常了。

$money=271.28;
echo $money=floor($money*pow(10,2))/100
我惊讶的发现输出的竟然不是271.28而是271.27!

后来查了好多资料,在php官网上看到了这么一点:

浮点数的精度有限,以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999999991118...所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。 

后来我打印了一下上面运算的结果:

printf("%.12f", $money*pow(10,2));
发现结果是:27127.999999999996

原来是精度问题。暂时还没找到统一的解决办法。我只有在代码逻辑中加入

if ($money - round ( $money, 2 ) 来避免已经精确了两位的数据再处理。<p>如果有人知道另一种实现我上述功能(精确到小数点后两位无论第三位是什么都舍弃)的方法请教教我。<br></p><p><spanfira sans pro font-size:16px line-height:24px background-color:rgb><spanfira sans pro font-size:16px line-height:24px background-color:rgb></spanfira></spanfira></p>
                
                
                <p>
                    以上就介绍了PHP的floor函数问题。,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。</p>
                <p>
                    </p>
             
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
Vorheriger Artikel:Eloquent ORM学习笔记Nächster Artikel:Mac下 升级 php+apache