Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP十进制计算_Php_Floating Point_Decimal - Fatal编程技术网

PHP十进制计算

PHP十进制计算,php,floating-point,decimal,Php,Floating Point,Decimal,我读到的是,在PHP中进行浮点比较和计算时必须小心。我不是PHP方面的专家,所以我想问问社区,用PHP进行精确十进制计算的最佳方法是什么 我正在开发一个计时卡应用程序,它可以计算一周内输入的所有时间。任何超过40小时的工作都被视为加班。然后,我想根据每个时间条目占总时间的百分比,将加班时间分配回各个时间条目 例如: 星期一=10小时 总时间=50小时 总加班时间=10小时 总时间的百分比(0.2)=周一(10小时)/总时间(50小时) 分配到周一的加班时间(2小时)=总加班时间(10小时)*总时

我读到的是,在PHP中进行浮点比较和计算时必须小心。我不是PHP方面的专家,所以我想问问社区,用PHP进行精确十进制计算的最佳方法是什么

我正在开发一个计时卡应用程序,它可以计算一周内输入的所有时间。任何超过40小时的工作都被视为加班。然后,我想根据每个时间条目占总时间的百分比,将加班时间分配回各个时间条目

例如:

星期一=10小时
总时间=50小时
总加班时间=10小时

总时间的百分比(0.2)=周一(10小时)/总时间(50小时)
分配到周一的加班时间(2小时)=总加班时间(10小时)*总时间的百分比(0.2)

现在为周一做一个新的记录,加班2小时,并从原来的记录中减去2小时

新条目:
星期一(8小时)=星期一-分配到星期一(2小时)的加班时间
周一加班=2小时


当使用整数作为原始条目时,情况似乎并不糟糕,但是当我开始使用浮点并且每天有多个时间条目时,会发生什么呢?每次输入的时间都会有一部分加班时间分配给它,但我需要确保不会分配更多的加班时间,并且我还需要确保每天和整个考勤卡的总时间与最初输入的时间相同。我读到比较php中的浮动是不安全的。我应该怎样计算呢。另外,最终输入的数字必须四舍五入到2个小数点(.##)

我认为您最好看看BCMath库/函数:

阅读,以了解为什么您必须小心混合浮点数和“小数”的概念(这与PHP完全无关)


它也有一个。你可以使用定点数学。例如,如果您的值需要精确到1美分,那么使用1美分作为单位,然后您可以使用值1234表示12.34,依此类推


您仍然会发现,包括除法在内的一些运算可能会返回浮点值。你只需要决定如何处理剩余的部分。例如,如果你有1.04,你将其除以5,那么结果应该是0.21(四舍五入或最接近)或0.20(四舍五入)等等。然后使用round、ceil或floor将其转换回整数。

在OP的情况下,这相当于以整数分钟甚至秒计算,而不是以浮点小时计算