我读到你必须小心PHP中的浮点比较和计算。我不是PHP的专家,所以我想我会问社区在PHP中进行精确十进制计算的最佳方法是什么。
我正在开发一个考勤卡应用程序,用于计算本周输入的所有时间。超过40小时的任何事情都被视为加班。然后,我想根据条目总时间的百分比,在每个时间条目中分配加班费。
示例:
星期一= 10小时
总时间= 50小时
总加班时间= 10小时
总时间百分比(0.2)=星期一(10小时)/总时间(50小时)
超时分配到星期一(2小时)=加班总时间(10小时)*总时间百分比(0.2)
现在为周一新加入2小时的加班时间并从原始输入中减去2小时。
新条目:
星期一(8小时)=星期一 - 加班到星期一(2小时)
星期一加班= 2小时
当使用整数作为原始条目时,事情似乎并不坏但是当我开始使用浮点数并且每天有多个时间条目时会发生什么?每次进入时都会分配一部分总加班时间,但我需要确保不分配更多的加班费然后可用,我还需要确保每天和整个考勤卡的总时间与原来相同进入。我读过比较浮点数在php中是不安全的。我应该怎么做计算。此外,最终输入的数字必须四舍五入到2个小数点(。##)
答案 0 :(得分:1)
阅读The Floating-Point Guide以了解为什么你必须小心混合浮点数和“小数”的概念(这与PHP完全没有任何关系)。
答案 1 :(得分:1)
您可以使用定点数学。因此,例如,如果您的值需要精确到1美分,那么使用1美分作为您的单位,然后您可以使用值1234来表示12.34,依此类推。
您仍会发现某些操作(包括除法)可能会返回浮点值。无论如何,你只需要决定如何处理其余部分。例如,如果你有1.04并且除以5,那么结果应该是0.21(向上舍入或最接近)或0.20(向下舍入)等。然后使用round,ceil或floor转换回整数。
答案 2 :(得分:0)
我认为你最好看一下BCMath lib / functions:http://php.net/manual/en/book.bc.php