请教大牛,PHP的sprintf问题

进击的代码 发布于 2016/10/02 19:31
阅读 708
收藏 1
PHP

这两天在深入恶补PHP内置函数,其中学习到sprintf这个函数的时候发现可以拿来做四舍五入,就自己做了个测试,结果发现个很懵逼的问题:

echo sprintf('%.2f',123.455);

为什么这个的结果是:123.45

echo sprintf('%.2f',12.455);

这个的结果是:12.46

在我看来只是整数部分不一样,但是四舍五入对小数的处理应该一样才对.请问下大牛们这个是为啥呢?

多谢了先.

加载中
0
朱__朱
朱__朱

因为浮点数是近似数,最后一位的精度是近似精度。123.455字面值在计算机里应该是123.45499...99类似这样的;12.455字面值在计算机里应类似是12.455000...01

所以在使用浮点数的时候,一定要心里牢记他是近似数,既然四舍五入,本身就代表了你能够接受精度丢失,所以选择保留精度时,选择一个可接受的精度即可。如果要做金融计算,就不要用浮点数,选择bcmath扩展用字符串数字进行数学预算,可以确保计算精度。

进击的代码
进击的代码
噢原来如此~~多谢指教:)我去学习下你推荐的扩展
1
wei2011
wei2011
这是所谓的“银行家算法”,就是前面是奇数的时候舍,偶数的时候入
进击的代码
进击的代码
我在学JAVA的时候的确有遇到过这个知识点,谢谢啊,回头再去重新学习下
0
Tuesday
Tuesday

(PHP 4, PHP 5, PHP 7)

round对浮点数进行四舍五入

这是这个函数吗? 

进击的代码
进击的代码
不是这个呢,是sprintf这个函数
0
Tuesday
Tuesday
  • f - the argument is treated as a float, and presented as a floating-point number (locale aware).

  • F - the argument is treated as a float, and presented as a floating-point number (non-locale aware). Available since PHP 4.3.10 and PHP 5.0.3. 

sprintf 谁说的可以四舍5入?

绿水本无忧
绿水本无忧
事实说明是不会四舍五入的,你的sprintf的第二个参数,应该是传入前就已经被四舍五入了,建议放出上文
进击的代码
进击的代码
能不能四舍五入我不清楚.不过你试试第二条语句看下结果呢.
0
红星xx
红星xx
你可能要研读一下sprintf函数的介绍 ,如果没有记错 。%.2f表示保留 点后面2位浮点 ,多余的会省去,应该不会四舍五入。至于整数后面补不补零,那就不记得了 。你可以试一下。
进击的代码
进击的代码
的确要补零的,和JS的toFixed()函数一样
返回顶部
顶部