在PHP中舍入
回答
http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
EDIT
$a = ((0.1 + 0.7) * 10) == 8;
var_dump($a);
echo '<br />';
define('PRECISION', 1.0e-08);
$a = (abs(((0.1 + 0.7) * 10) - 8) < PRECISION);
var_dump($a);
浮点算术并不精确。而不是8.0正好你可以得到7.999 ...当被转换为整数时被截断为7。
echo number_format((0.1 + 0.7) * 10, 20);
结果:
7.99999999999999911182
''var_dump((0.1 + 0.7)* 10);'将'float(8)'四舍五入'输出无助于此。 – 2010-08-18 13:46:01
因为浮点数操作不是100%准确,propably从表达铸造前值是一样的东西7.9999 ...
引述big fat red warning in the PHP Manual on Floating Point Precision:
典型的是简单的小数部分如
0.1
或0.7
不能转换成其内部的二进制对应,而不会有小的精度损失。这可能会导致令人困惑的结果:例如,floor((0.1+0.7)*10)
通常会返回7
而不是预期的8
,因为内部表示将类似于7.9
。这是由于这样一个事实,即不可能用有限数字的数字表示一些十进制符号的分数。例如,十进制形式的
1/3
变成0.3
。所以不要将浮点数结果信任到最后一位数字,也绝不会比较浮点数是否相等。如果需要更高的精度,则可以使用the arbitrary precision math functions和gmp功能。
特别是,只能用“p/q”形式表示的小数,其中q是2的整数次幂,p是任意整数,可以用有限数量的比特精确表示。 – Artefacto 2010-08-18 15:02:20
马克的响应击中了要害,但我想铸造的,而不是你想要的轮PHP函数:
从The Flaoting-Point Guide(点击查看详细解释):
由于内部计算机使用 格式(二进制浮点数),因此 无法准确表示数字 ,如0.1,0.2或0.3,,全部为。
当代码被编译或解释 ,你的“0.1”是已经 四舍五入至在于 格式最接近的数字,这导致一个小 舍入误差的 计算发生甚至之前。
你可以做的比较是这样的:如果你想钻研长的答案
$a = round(((0.1 + 0.7) * 10), 1) == (int)round(((0.1 + 0.7) * 10), 1);
- 1. 舍入到在PHP
- 2. php,舍入数
- 3. PHP舍入号码
- 4. PHP向下舍入
- 5. 在Oracle中的舍入舍入
- 6. 在php中舍入不同的数字
- 7. 在PHP中舍入小数点
- 8. 在Silverlight中舍入
- 9. PHP舍入汇率转换
- 10. PHP精确舍入问题
- 11. PHP整数舍入问题
- 12. PHP四舍五入数
- 13. 四舍五入价格在PHP
- 14. 在C中舍入double值#
- 15. 在Java中舍入小数
- 16. 在eclipse中舍入Imageview?
- 17. 在Java中舍入值
- 18. 在swift中向下舍入
- 19. 如何在Excel中舍入
- 20. 在VB.NET中四舍五入
- 21. 在Java中舍入Float.parseFloat
- 22. 在摊销表中舍入
- 23. 在Python中舍入3.3.5
- 24. 四舍五入在Java中
- 25. 在LABVIEW中四舍五入
- 26. 在UDF中使用Excel的舍入舍入1到0
- 27. T-SQL:舍入到宿舍
- 28. R舍入单位的舍入数
- 29. 用php向下舍入数字
- 30. PHP如何四舍五入总计
:http://docs.sun.com/source/806-3568/ncg_goldberg.html – webbiedave 2010-08-18 13:53:17
另请参阅我的文章http://www.exploringbinary.com/when-floats-dont-behave-like-floats/(特别参见程序2)。 (基本上只是在下面的答案中描述的现象的更多细节,尽管在不同的上下文中)。 – 2010-08-18 18:57:04