2012-05-17 38 views
5

Tôi có một thuật toán mà thực hiện các tính toán sau:Không có chức năng Truncate trong PHP - Tùy chọn?

  1. ((0,50 * 0) + 7)/10 = 0,70
  2. ((0,70 * 10) + 9)/20 = 0,80
  3. ((0,80 * 20) + 7)/30 = 0,7666666667 -> tôi muốn giá trị này để cắt ngắn để 0,76

vì vậy mà nó có thể đưa vào phần còn lại của việc tính toán như:

4a. ((0,76 * 30) + 8)/40 = 0,77

không để nuôi trong khi làm tròn lên hai chữ số thập phân như 0,77:

4b. ((0,77 * 30) + 8)/40 = 0,77

**** Sau đây dường như đã thất bại và thay vào đó buộc một vòng lên đến 0,77: ****

Các PHP sptrinf () chức năng: PHP dropping decimals without rounding up

Các PHP number_format() chức năng: PHP: show a number to 2 decimal places

tầng PHP() chức năng: Truncate float numbers with PHP

  • Có cách nào khác không?
  • Có thể nào đạt được những gì tôi muốn (cắt ngắn đến hai chữ số thập phân) bằng PHP không?

Vui lòng hỗ trợ. Cảm ơn nhiều.

CẬP NHẬT - SOLVED Ok, hiện tại, nó đang hoạt động nhờ dkamins và zneak. Tôi đã sử dụng cách tiếp cận floor() (tôi cho rằng tôi đã không làm điều gì đó đúng trong quá khứ). Tuy nhiên, hiện tại điều sau xảy ra:

ví dụ:

(0,86 * 30) + 9)/40 = 0,87 (nó nên), nhưng sau khi TRUNC nó = 0.86

Làm thế nào là nó cắt xén 0,87-0,86? Không có nghĩa lý gì. Có cách nào để làm cho nó cắt ngắn chỉ khi có nhiều hơn 2 chữ số thập phân?

SOLVED:

$numDecPlace = strlen(substr(strrchr($newRel, "."), 1)); 
echo '<p>Test: Number of decimal places=' .$numDecPlace. '</p>'; 
if($numDecPlace > 2) { 
    $newRel = floor($newRel * 100)/100; // Truncate to 2dp. 
    echo '<p>Test: New relationship truncated is $newRel=' .$newRel. '</p>'; 
} 
+0

Đã giải quyết cập nhật của tôi. – leokennedy

+0

Bạn nên xem @Fernando Prieto [câu trả lời bên dưới] (http://stackoverflow.com/a/19124167/1890400). Ông sử dụng một phương pháp tiếp cận dựa trên chuỗi (phụ) tương tự như phần đầu tiên của giải pháp bạn đã chọn, nhưng cá nhân tôi nghĩ rằng nó có thể hiệu quả hơn và mạnh mẽ hơn. – Byson

Trả lời

4

Bạn có thể sử dụng floor chức năng của PHP cùng với một số thập phân thay đổi như sau:

floor(0.7666666667 * 100)/100; 
+3

Và nếu bạn tìm thấy nó xấu xí, bạn có thể làm cho một wrapper mỏng xung quanh nó: 'chức năng trunc ($ số, $ địa điểm) {$ power = pow (10, $ địa điểm); sàn trả lại ($ number * $ power)/$ power; } ' – zneak

+0

Ok, đây là quá nhiều.Nó dường như đang hoạt động (điển hình). Tôi đã sử dụng cả hai sàn tiêu chuẩn (num * 100)/100 và chức năng (nhờ zneak) và cả hai công việc tuyệt vời và tôi nhận được 0,76 của tôi. Cảm ơn nhiều. Tuy nhiên, tôi có một theo dõi, xem ở trên :) – leokennedy

2

thế nào về round()

<?php 
    echo round(3.4);   // 3 
    echo round(3.5);   // 4 
    echo round(3.6);   // 4 
    echo round(3.6, 0);  // 4 
    echo round(1.95583, 2); // 1.96 
    echo round(1241757, -3); // 1242000 
    echo round(5.045, 2); // 5.05 
    echo round(5.055, 2); // 5.06 
    ?> 
4

Tất cả các câu trả lời cho ở đây vòng num ber. Chức năng này làm việc cho tôi và tôi hy vọng cho bạn.

function truncate($number, $decimals) 
{ 
    $point_index = strrpos($number, '.'); 
    return substr($number, 0, $point_index + $decimals+ 1); 
} 

đâu $number là số cần cắt ngắn và $decimals là số thập phân mà bạn muốn. Ví dụ:truncate(-38.59540719940386 , 6); lợi nhuận -38,595407

Nếu bạn muốn, kiểm tra tài liệu substr 's!

+0

Tôi thích chức năng này vì nhiều lý do: rõ ràng, dễ hiểu chính xác nó hoạt động như thế nào, không có ma thuật khó hiểu nào xảy ra. Hơn nữa nó khá hiệu quả và bạn biết 100% chắc chắn rằng không có lỗi làm tròn kỳ lạ nào sẽ nhảy vào. – Byson

+0

Chức năng này hoạt động không chính xác với phao ở dạng expotential ("2.5E7" chẳng hạn ". Ngoài ra, đối với các số dấu phẩy động cực nhỏ, nó trả về chuỗi như "-0.0000000" –

0

Tôi đã sử dụng sẽ sử dụng hàm round() như đã đề cập bởi Kartikey. Bạn có thể tìm thêm thông tin ở đây tại PHP.Net

float round (float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]) 

Fissh

+0

Có vẻ như không phải là một chế độ cho "về phía không", vì vậy nó không thể được sử dụng. – CoDEmanX

1

Để làm điều này một cách chính xác cho cả đã + số-ve bạn cần sử dụng:
- php floor() chức năng cho ve số
- chức năng php ceil() cho số có sẵn

function truncate_float($number, $decimals) { 
    $power = pow(10, $decimals); 
    if($number > 0){ 
     return floor($number * $power)/$power; 
    } else { 
     return ceil($number * $power)/$power; 
    } 
} 

lý do cho điều này là floor() luôn làm tròn số xuống, không phải về 0.
tức floor() hiệu quả đạn số-ve hướng tới một giá trị tuyệt đối lớn hơn
ví dụ floor(1.5) = 1 khi floor(-1.5) = 2

Vì vậy đối với phương pháp sử dụng truncate multiply by power, round, then divide by power:
- floor() chỉ hoạt động cho các số dương
- ceil() chỉ hoạt động cho số âm

Để kiểm tra điều này, hãy sao chép mã sau đây vào trình chỉnh sửa của http://phpfiddle.org/lite (hoặc tương tự):

<div>Php Truncate Function</div> 
<br> 
<?php 
    function truncate_float($number, $places) { 
     $power = pow(10, $places); 
     if($number > 0){ 
      return floor($number * $power)/$power; 
     } else { 
      return ceil($number * $power)/$power; 
     } 
    } 

    // demo 
    $lat = 52.4884; 
    $lng = -1.88651; 
    $lat_tr = truncate_float($lat, 3); 
    $lng_tr = truncate_float($lng, 3); 
    echo 'lat = ' . $lat . '<br>'; 
    echo 'lat truncated = ' . $lat_tr . '<br>'; 
    echo 'lat = ' . $lng . '<br>'; 
    echo 'lat truncated = ' . $lng_tr . '<br><br>'; 

    // demo of floor() on negatives 
    echo 'floor (1.5) = ' . floor(1.5) . '<br>'; 
    echo 'floor (-1.5) = ' . floor(-1.5) . '<br>'; 
?> 
Các vấn đề liên quan