我需要将一个简单的C程序移植到PHP。目前我们必须启动该过程并解析它的输出。该程序非常简单,但算法使用float
非常重要,因为错误总结并且结果将会消失。
C示例:
#include <stdio.h>
int main( void ) {
printf("%f\n", 123456 * (float)0.99524);
printf("%f\n", 123456 * (double)0.99524);
return 0;
}
PHP示例:
<?php
printf("%f\n", 123456 * 0.99524);
?>
C示例将导致122868.343750
和122868.349440
,而PHP将以122868.349440
结束。
如何在PHP中获得C float
结果?
答案 0 :(得分:2)
使用内置的php函数无法做到这一点。
使用“double”的那个给你真实的结果,100%精确。浮动一个是错误的。
在PHP中,float和double是相同的类型,它是double。
如果您需要高精度结果,总是会得到相同的结果,请尝试使用BC Math模块:http://php.net/bcmath
使用BC Math的示例代码:
$result = bcmul("123456", "0.99524", 6); // gives 122868.34944
$result = number_format($result, 6, ".", ""); // 122868.349440 - appending zeros
echo $result;
输出:
122868.349440
如果你真的想要与C程序中的结果相同,那么你有两个选择:
通过编写php扩展来创建自己的类c函数:http://www.google.com/search?q=writing+php+extensions
通过函数proc_open()从PHP与您的C程序对话: http://www.php.net/manual/en/function.proc-open.php(另请参阅popen(),exec()或shell_exec())
答案 1 :(得分:0)
您总是可以创建一个PHP模块。
以下列出了我随时间编制的资源......
http://www.delicious.com/homer6/php+extension
另外,我强烈推荐阅读Sara Goleman的书:
http://blog.simonholywell.com/post/1156691738/15-excellent-resources-for-php-extension-development
希望有帮助...
答案 2 :(得分:-2)
浮点数的精度有限。虽然这取决于 在系统中,PHP通常使用IEEE 754双精度格式, 由于订单的舍入,这将产生最大的相对误差 1.11e-16。非基本算术运算可能会更大 错误,当然,必须考虑错误编程 几个操作复杂化。
此外,有理数的数字可以完全表示为 基数10中的浮点数,如0.1或0.7,没有 精确表示为基数2中的浮点数,即 内部使用,无论尾数的大小。因此,他们 没有a就无法转换成它们的内部二进制对应物 精度损失小。这可能导致令人困惑的结果:for 例如,floor((0.1 + 0.7)* 10)通常会返回7而不是 预期8,因为内部表示将是类似的 7.9999999999999991118 ....
所以永远不要将浮动数字结果信任到最后一位数字,永远不要 比较浮点数是否相等。如果精度更高 必要的,任意精度数学函数和gmp函数 可用。
引自:http://php.net/manual/en/language.types.float.php
要更改PHP的精确级别,请更改 php.ini
中的precision
设置