2016-03-27 4 views
0

私はここでは難しい問題に直面しており、解決方法はわかりません。 私は2つのテーブルを持っています。タスクテーブルとプロジェクトテーブル。タスクテーブルには、費やされた時間(秒単位)、その特定のタスクの1時間当たりの速度、およびそのプロジェクトが属するプロジェクトが格納されます。だから、基本的にはこのような何か:時間を掛けることによって計算された金額をフォーマットします*レート(db内の複数のエントリ)

{id} - {seconds} - {rate} - {projectId} 

さて、私はこのような特定のタスクのための時間あたりの課金率を計算しています:

function calc ($Totalseconds, $rate){ 
    $minutes = $Totalseconds/60;  //minutes 
    $money = $rate * ($minutes/60); //hours 
    return $money; 
} 
... 
$money = calc($task['seconds'], $task['rate']); 
$value = number_format($money,2); //ex. 1,824.69 

もちろんこれは、例えば....うまく機能:

task1 is 1,824.69 
task2 is 24.33 
etc.... 

プロジェクトにはいくつかのタスクしかない限り、そのプロジェクトの総請求レートは正しいです。しかし、プロジェクトの下にいくつかのタスク以上のものがある場合、合計値は私が計算機で手動でそれらをすべて追加しているときとは少し異なります...したがって、別のページでは、特定のプロジェクトの総請求料金を表示していますその特定のプロジェクトのすべてのタスクと料金を計算します。

私は、配列内の特定のPROJECTID用DBからすべてのタスク「を選択する」午前、その後、実行します。私は手動ですべてのタスクの課金レートを追加していた場合

//array projArray has the sum of all seconds and rate for every task under a specific project 
//for example a project has 10 tasks with rate $12 p/h and 2 task with $10 p/h 
//so projArray has 2 arrays. One for the total time in seconds for the 10 tasks + their rate and one for the 2 tasks + their rate. 
$total = 0; 
foreach($projArray as $value) { 
    $total += calc($value['TotalTime'], $value['rate']); 
} 
$Totalvalue = number_format($total,2); 

そしてここでは、問題は...です特定のプロジェクトの計算機では2,426.91が返されますが、この最後の関数は代わりに2,426.92を返します。

どちらの場合も、秒数とレートは正しいです。私はなぜそれが最終的な価値との違いはありませんか? 私はプロジェクトの下にあるより多くのタスクが大きいほど違いはないと思いますか?今、私は、各プロジェクト

+0

大きな違いはありませんが、誤差の丸めや精度の低下のいずれかの結果に見えます。これを避けるには、時価を10進数(またはさらに悪い浮動小数点数)ではなくセントで格納し、最終的に_formatting_として表示する必要があります。 – CBroe

+0

レートと秒は常に整数です...私は$ minutes = $ Totalseconds/60と推測します。 20.9458333333 .... – user1033882

答えて

1

例のデータのために... 1-50タスクで物事をテストしてい:あなたが個別に各タスクにをnumber_formatを呼び出すと

a: 1,233 
b: 1,233 
c: 1,233 

number_format((a + b + c), 2) = 3,70 
number_format(a, 2) + number_format(b, 2) + number_format(c, 2) = 3,69 

、0003は四捨五入されています。

あなたの計算では、おそらく同様のことが起こります。

+0

ええ、私は今、私が請求レートを計算している方法が、例えばすべてのタスクのように長い10進数を生成していることに気付きました。 \t $ sum_in_minutes = $時間/ 60; \t $ money = $ rate *($ sum_in_minutes/60); は、各タスクに長い浮動数値を作成します。これらを一緒に追加すると、おそらくこの違いが生じます。 – user1033882

+0

私は$ money = floor($ money * 100)/ 100のように金額を計算しました。 この後、お金の価値は同じです:) – user1033882

関連する問題