2010-01-10 37 views
12

Thời gian để kiểm tra kỹ năng toán học của bạn ...Trung bình toán học với php

Tôi đang sử dụng php để tìm mức trung bình $ num1, $ num2, $ num3 v.v. tối đa số lượng không được đặt số. Sau đó nó sẽ tiết kiệm trung bình đó cho một cơ sở dữ liệu.

Lần sau, tập lệnh php được gọi là số mới được thêm vào danh sách kết hợp.

Có phương trình toán học (đại số có khả năng nhất) mà tôi có thể sử dụng để tìm số trung bình của các số gốc với số mới được đưa vào. Hoặc tôi có cần phải lưu các số nguyên trong cơ sở dữ liệu để tôi có thể truy vấn chúng và tính toán lại toàn bộ các chuỗi số với nhau không?

Trả lời

10

Nếu những gì bạn có nghĩa là bằng trung bình là trung bình và bạn không muốn để lưu trữ tất cả các số sau đó lưu lượng số:

$last_average = 100; 
$total_numbers = 10; 
$new_number = 54; 

$new_average = (($last_average * $total_numbers) + $new_number)/($total_number + 1); 
+0

'$ total_numbers' có thể không khả dụng. –

+4

$ total_numbers là chi tiết triển khai ** bắt buộc ** cho vấn đề được chỉ định. Hoặc thực hiện nó hoặc vấn đề là unsolvable. – slebetman

+6

Điều này sẽ dẫn đến mất độ chính xác ngày càng tăng. Sử dụng $ last_total thay vì $ last_average. Xem câu trả lời của Mike. – GZipp

-2

Bạn cần phải lưu tất cả các số nguyên trong cơ sở dữ liệu.

1

Nếu bạn biết số lượng số bạn có thể tính tổng số tiền cũ, hãy thêm số mới và chia cho số tiền cũ cộng một số.

$oldsum = $average * $amount; 
$newaverage = ($oldsum + $newnum)/($amount + 1); 
+0

@slebetman - Nhưng đó cũng giống như câu trả lời bạn đã chấp nhận. – GZipp

+0

Ah .. xin lỗi, tôi đã đọc sai mã. Tôi rút lại bình luận trước đó của tôi. – slebetman

12
Average = Sum/Number of values 

Chỉ cần lưu trữ tất cả 3 giá trị, không cần cho bất cứ điều gì phức tạp.

Nếu bạn lưu trữ AverageSum thì tính Number of values bạn sẽ mất một chút chính xác do cắt ngắn Trung bình.

Nếu bạn lưu trữ AverageNumber of values thì tính Sum bạn sẽ mất chính xác hơn nữa. Bạn có nhiều lợi nhuận hơn khi tính toán một giá trị chính xác cho Number of values hơn Sum nhờ vào nó là một số nguyên.

+0

Bạn không cần phải lưu trữ trung bình, bạn có thể tính toán nó mà không mất bất kỳ độ chính xác nào. – starblue

1

Điển hình là những gì bạn có thể làm là tiết kiệm hai mẩu thông tin:

  • tổng của tất cả những con số
  • đếm số

Bất cứ khi nào bạn muốn nhận được mức trung bình, chia số tiền bằng số (tất nhiên là chăm sóc cho trường hợp đếm == 0). Bất cứ khi nào bạn muốn bao gồm một số mới, hãy thêm số mới vào tổng và tăng số đếm bằng 1.

0

Đây được gọi là 'trung bình chạy' hoặc 'moving average'.

Nếu cơ sở dữ liệu lưu trữ số trung bình số giá trị trung bình, có thể tính toán giá trị trung bình mới cho mỗi giá trị mới.

45
array_sum($values)/count($values) 
+0

Tại sao tôi không nghĩ đến điều này haha ​​ –

+0

Chia cho số không khi giá trị $ trống rỗng –

+0

$ avg = 0; nếu (số (giá trị $)) { $ avg = array_sum (giá trị $)/số (giá trị $); } –

0
function avgvals($avg_vals,$avg_delimiter=',') { 
if ((is_string($avg_vals) && strlen($avg_vals) > 2) && (is_string($avg_delimiter) && !empty($avg_delimiter))) { 
    $average_vals = explode($avg_delimiter, $avg_vals); 
     $return_vals = (array_sum($average_vals)/count($average_vals)); 
} elseif ((is_string($avg_vals) && strlen($avg_vals) <= 2) && (is_string($avg_delimiter) && !empty($avg_delimiter))) { 
     $return_vals = $avg_vals; 
} else { 
     $return_vals = FALSE; 
} 
    return $return_vals; 
} 
2

tưởng rằng tôi nên chia sẻ chức năng của tôi

function avg($sum=0,$count=0){ 
    return ($count)? $sum/$count: NAN; 
} 
var_dump(avg(array_sum($values),count($values))); 

Sẽ trở lại mức trung bình và cũng có thể đưa vào tài khoản 0, ví dụ chia cho zero luôn lợi nhuận NaN (Không phải số)

1/0 = NaN
0/0 = NaN

Các vấn đề liên quan