2012-01-31 12 views

Trả lời

31

Bạn cần floor() theo cách này:

$rounded = floor($float*100)/100; 

Hoặc bạn cast để nguyên:

$rounded = 0.01 * (int)($float*100); 

Bằng cách này nó sẽ không được làm tròn lên.

+0

Hoạt động tốt trừ khi trailing 0 trong ví dụ này là một yêu cầu. – Leigh

+0

@Độ cao: Giải quyết [trong câu trả lời này] (http://stackoverflow.com/a/9079258/367456). – hakre

+1

Đối với các giá trị âm, sử dụng ceil() thay vì floor() –

2

bạn có thể chuyển đổi 1.505 thành loại dữ liệu chuỗi và sử dụng substring() để cắt ngắn ký tự cuối cùng.
Và một lần nữa chuyển đổi nó trong integer.

+1

nếu số này dài hơn 1 chữ số sau dấu phẩy thì sao? –

+0

Bạn có ít nhất đọc, những gì OP muốn ?? – Legionar

13
$float = 1.505; 

echo sprintf("%.2f", $float); 

//outputs 1.50 
+1

+1, đơn giản và ngọt ngào. – hakre

+0

Hoạt động tốt đẹp khi kết hợp với typecasting '(float) $ float' nếu bạn tiếp tục sử dụng tính năng này trong các phép tính. –

+8

Điều quan trọng cần lưu ý là 'sprintf' sẽ ROUND phao nếu nó nghĩ là cần. Ví dụ, lấy phân chia '31/53 = 0.584905 [...]' - nếu chúng ta muốn 3 chữ số thập phân, chúng ta có thể làm 'sprintf ("%. 3f ", (31/53))' nhưng điều này KHÔNG cho chúng tôi 0,584. Nó cho chúng ta 0,585. –

0

chỉ làm (int) $number; để có được số nguyên

+0

Bạn có ít nhất đọc, những gì OP muốn ?? – Legionar

3

Có thể đó là quá muộn, nhưng đây là một cách tiếp cận tốt:

$getTruncatedValue = function($value, $precision) 
    { 
     //Casts provided value 
     $value = (string)$value; 

     //Gets pattern matches 
     preg_match("/(-+)?\d+(\.\d{1,".$precision."})?/" , $value, $matches); 

     //Returns the full pattern match 
     return $matches[0];    
    }; 

    var_dump 
    (
     $getTruncatedValue(1.123,1), //string(3) "1.1" 
     $getTruncatedValue(1.345,2), //string(4) "1.34" 
     $getTruncatedValue(1.678,3), //string(5) "1.678" 
     $getTruncatedValue(1.90123,4) //string(6) "1.9012" 
    ); 
  • Các pitfall chỉ trong cách tiếp cận này có thể là cần thiết để sử dụng một Regular Expression (đôi khi có thể mang lại một hình phạt hiệu suất).

Lưu ý: Rất khó để tìm cách tiếp cận gốc để cắt bớt số thập phân và tôi nghĩ không thể thực hiện việc sử dụng chức năng chạy nước rút và các chuỗi liên quan khác.

+1

Cảm ơn, tôi muốn thử cái này. – reignsly

3

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

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

Do đó, đối với phương pháp multiply by power, remove decimals, divide by power truncate:
- 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 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>'; 
?> 
0

Tôi biết đây là câu trả lời muộn nhưng đây là giải pháp đơn giản. Sử dụng ví dụ OP của 1.505 bạn có thể chỉ cần sử dụng sau đây để có được đến 1,50.

function truncateExtraDecimals($val, $precision) { 
    $pow = pow(10, $precision); 
    $precise = (int)($val * $pow); 
    return (float)($precise/$pow); 
} 

Điều này quản lý cả giá trị dương và âm mà không quan tâm đến chức năng sử dụng và cho vay để sửa kết quả mà không lo lắng về những chức năng khác có thể làm với giá trị.

$val = 1.509; 
$truncated = sprintf('%.2f', truncateExtraDecimals($val, 2)); 
echo "Result: {$truncated}"; 

Result: 1.50 

Cần có sprintf để nhận chính xác 2 số thập phân để hiển thị nếu không kết quả sẽ là 1,5 thay vì 1,50.

0

Chúng ta có thể sử dụng chức năng bc nếu họ có sẵn:

echo bcadd(sprintf('%F', 5.445), '0', 2); // => 5.44 
echo sprintf('%.2F', 5.445); // => 5.45 
0
$num = 118.74999669307; 
$cut = substr($num, 0, ((strpos($num, '.')+1)+2));` 
// Cut the string from first character to a length of 2 past the decimal. 
/substr(cut what, start, ((find position of decimal)+decimal itself)+spaces after decimal)) 
echo $cut; 

điều này sẽ giúp bạn rút ngắn giá trị float mà không làm tròn nó ..