1


0

PHP 10進計算

PHPでの浮動小数点の比較と計算には注意する必要があることを読んでいました。 私はPHPの専門家ではないので、PHPで正確な10進計算を行うための最良の方法はコミュニティに尋ねると思いました。

週に入力されたすべての時間を計算するタイムカードアプリケーションを開発しています。 40時間を超えるものは残業とみなされます。 次に、エントリが合計時間に占める割合に基づいて、各タイムエントリにその残業時間を振り分けます。

例:

月曜日= 10時間+合計時間= 50時間+合計残業時間= 10時間

合計時間の割合(0.2)=月曜日(10時間)/合計時間(50時間)+月曜日に割り当てる残業時間(2時間)=合計残業時間(10時間)*合計時間の割合(0.2)

ここで、月曜日に2時間の残業を伴う新しいエントリを作成し、元のエントリから2時間を差し引きます。

新規エントリ:+月曜日(8時間)=月曜日-時間外勤務を月曜日に割り当てる(2時間)+月曜日残業= 2時間

元のエントリとして整数を使用する場合、事態は悪くないように見えますが、floatを使用し始めて1日あたり複数の時間エントリがある場合はどうなりますか? 各時間のエントリには、残業時間の合計の一部が割り当てられますが、利用可能な時間外労働時間をそれ以上割り当てないことを確認する必要があります。また、毎日とタイムカード全体の合計時間が元の時間と同じになるようにする必要があります入った。 私はPHPでフロートを比較することは安全ではないことを読みました。 計算はどのようにすればよいですか。 また、最後に入力した数値は小数点以下2桁に丸める必要があります(。##)

3 Answer


1


The Floating-Point Guideを読んで、浮動小数点数の混合と「10進」の概念にまったく注意する必要がある理由を理解してください(これはまったく関係ありません)特にPHP)。

また、http://floating-point-gui.de/languages/php/ [PHP用のチートシート]もあります。


1


固定小数点演算を使用できます。 たとえば、値を1セントまで正確にする必要がある場合は、1セントを単位として使用し、1234という値を使用して12.34などを表すことができます。

除算を含む一部の操作では、浮動小数点値が返される場合があります。 とにかく残りをどうするかを決める必要があります。 たとえば、1.04があり、それを5で除算すると、結果は0.21(切り上げまたは最も近い)または0.20(切り捨て)などになります。 次に、round、ceil、またはfloorを使用して整数に戻します。


0


BCMathのlib / functionsをご覧になることをお勧めします:http://php.net/manual/en/book.bc.php