art*_*bot 0 php printf rounding
我一直在依赖,sprintf('%0.1f', 2.25) === '2.3'但事实证明它进来了2.2!
事实上,这似乎是随机的:
php > for ($j=0;$j<=10;$j++) { printf( "%s -> %0.1f\n",$j+ 0.05, $j+0.05); }
0.05 -> 0.1 // Up, as expected
1.05 -> 1.1 // Up, as expected
2.05 -> 2.0 // Down!
3.05 -> 3.0 // Down!
4.05 -> 4.0 // Down!
5.05 -> 5.0 // Down!
6.05 -> 6.0 // Down!
7.05 -> 7.0 // Down!
8.05 -> 8.1 // Up, as expected
9.05 -> 9.1 // Up, as expected
Run Code Online (Sandbox Code Playgroud)
我完全没有抓住重点吗?我觉得我脚下的地毯被拉开了,我在学校学到的一切都是错误的......!当然,一个对数字进行四舍五入的函数应该始终如一地做到这一点吗?(我注意到它round($n, 1)按预期工作。)
你应该使用 round
http://php.net/manual/en/function.round.php
round(2.25, 2) === floatval('2.3')
Run Code Online (Sandbox Code Playgroud)
总结一下答案中评论中所说的内容:
因为printf它不是舍入函数,而是给出数字的字符串表示形式的低级函数。在这种情况下,内部数字与数字集不同,例如,这可能是2.249999991231231123由于浮点内部表示的限制。
因此printf,将不同的数字四舍五入为您输入/计算的数字,这2.2在本例中是正确的。
因此,正如另一个答案(以及我原来的问题)指出的那样,更好的解决方案是使用round()(并且可能sprintf根据结果)。
| 归档时间: |
|
| 查看次数: |
1925 次 |
| 最近记录: |