Làm thế nào để nhận được phần nguyên và phần thập phân của một số?


98

Cho, giả sử, 1,25 - làm cách nào để lấy phần "1" và. "25" của số này?

Tôi cần kiểm tra xem phần thập phân có phải là .0, .25, .5 hoặc .75 hay không.


Một vụ nổ đơn giản sẽ hoạt động? $ splitDec = boom (".", $ decimal); $ splitDec [0] bây giờ sẽ bằng 1 và splitDec [1] bây giờ sẽ là 25 từ ví dụ của bạn.
Matt,

@Matt split()đã không được dùng nữa.
alex

@alex yea, quên mất. Đang suy nghĩ javascript. đổi thành nổ.
Matt,

@Matt, split đã không được chấp nhận kể từ PHP 5.3 và thực sự lấy regex làm đối số của nó, trong khi bùng nổ lấy một chuỗi. boom () được ưu tiên trong trường hợp này.
trú ẩn

4
Hãy nhận biết rằng explode(".",1.10);wil cho 1 và 1, không 1 và 10
Michel

Câu trả lời:


177
$n = 1.25;
$whole = floor($n);      // 1
$fraction = $n - $whole; // .25

Sau đó so sánh với 1/4, 1/2, 3/4, v.v.


Trong trường hợp số âm, hãy sử dụng:

function NumberBreakdown($number, $returnUnsigned = false)
{
  $negative = 1;
  if ($number < 0)
  {
    $negative = -1;
    $number *= -1;
  }

  if ($returnUnsigned){
    return array(
      floor($number),
      ($number - floor($number))
    );
  }

  return array(
    floor($number) * $negative,
    ($number - floor($number)) * $negative
  );
}

Các $returnUnsigneddừng lại nó từ làm -1,25 để -1 & -0.25


7
Là một bên, intval()hoặc đúc đơn giản như (int)có thể được nhiều hơn performant hơnfloor()
Jason McCreary

1
Làm thế nào để sàn tính cho phủ định?
LanceH

@LanceH: Không, nhưng bạn có thể làm cho nó xử lý nó khá dễ dàng với một lá cờ phủ định.
Brad Christie

4
Câu trả lời này thực sự không chính xác trừ khi bạn thêm dấu tròn (). Nghe có vẻ ngớ ngẩn, tôi biết, nhưng nó liên quan đến số học dấu phẩy động cấp thấp. Xem ở đây: stackoverflow.com/questions/3726721/php-math-precision
Matt James

Thử với 510,9, trả về 0,89. Nhưng không thể nói tại sao.
T30,

38

Mã này sẽ chia nó ra cho bạn:

list($whole, $decimal) = explode('.', $your_number);

trong đó $ whole là số nguyên và $ decimal sẽ có các chữ số sau dấu thập phân.


9
Hãy nhận biết rằng explode(".",1.10);wil cho 1 và 1, không 1 và 10
Michel

3
Điều này phá vỡ và ném cảnh báo về chỉ mục không xác định, nếu số là số nguyên hoặc không chứa phần thập phân.
Andreyco

1
Điều này giả định rằng số cuối cùng sẽ không được biểu diễn trong ký hiệu khoa học khi truyền sang chuỗi. Nếu đó là một con số thực sự rất lớn hoặc thực sự rất nhỏ thì điều này sẽ không xảy ra và phương pháp này sẽ bị phá vỡ.
GordonM

20

Chỉ để khác biệt :)

list($whole, $decimal) = sscanf(1.5, '%d.%d');

CodePad .

Như một lợi ích bổ sung, nó sẽ chỉ phân chia khi cả hai bên đều bao gồm các chữ số.


2
Cái này không bị vỡ nếu số không chứa phần thập phân. Tuyệt quá!
Andreyco

Rất vui khi điều này xuất ra hai số nguyên; chứ không phải là một int và một float.
foochow 12/1213

1
Điều này giả định rằng số cuối cùng sẽ không được biểu diễn trong ký hiệu khoa học khi truyền sang chuỗi. Nếu đó là một con số thực sự rất lớn hoặc thực sự rất nhỏ thì điều này sẽ không xảy ra và phương pháp này sẽ bị phá vỡ.
GordonM

18

Phương thức floor () không hoạt động đối với các số âm. Điều này hoạt động mọi lúc:

$num = 5.7;
$whole = (int) $num;  // 5
$frac  = $num - $whole;  // .7

... cũng hoạt động cho các phủ định (cùng mã, khác số):

$num = -5.7;
$whole = (int) $num;  // -5
$frac  = $num - $whole;  // -.7

8

một cách ngắn (sử dụng sàn và fmod)

$var = "1.25";
$whole = floor($var);     // 1
$decimal = fmod($var, 1); //0.25

sau đó so sánh $ thập phân với 0, .25, .5 hoặc .75


Tôi chấp nhận câu trả lời này! Nó gần giống với C # (a % 1)VÀ nó xử lý tốt các số âm.
Bitterblue

7

Truyền nó dưới dạng số nguyên và số trừ

$integer = (int)$your_number;
$decimal = $your_number - $integer;

Hoặc chỉ lấy số thập phân để so sánh

$decimal = $your_number - (int)$your_number

5

Cũng có một hàm fmod, có thể được sử dụng: fmod ($ my_var, 1) sẽ trả về cùng một kết quả, nhưng đôi khi có một lỗi nhỏ.


3

PHP 5.4+

$n = 12.343;
intval($n); // 12
explode('.', number_format($n, 1))[1]; // 3
explode('.', number_format($n, 2))[1]; // 34
explode('.', number_format($n, 3))[1]; // 343
explode('.', number_format($n, 4))[1]; // 3430

2

Đây là cách tôi sử dụng:

$float = 4.3;    

$dec = ltrim(($float - floor($float)),"0."); // result .3

1

Phương pháp của Brad Christie về cơ bản là đúng nhưng nó có thể được viết ngắn gọn hơn.

function extractFraction ($value) 
{
    $fraction   = $value - floor ($value);
    if ($value < 0)
    {
        $fraction *= -1;
    }

    return $fraction;
}

Điều này tương đương với phương pháp của anh ấy nhưng ngắn hơn và hy vọng là dễ hiểu hơn.



1

Nếu bạn có thể tin rằng nó luôn có 2 chữ số thập phân, bạn có thể chỉ cần sử dụng một phép toán chuỗi:

$decimal = 1.25;
substr($decimal,-2);  // returns "25" as a string

Không có ý tưởng về hiệu suất nhưng đối với trường hợp đơn giản của tôi, điều này tốt hơn nhiều ...


Lưu ý: nếu bạn làm điều này, bạn nên sử dụng ít nhất round ($ decimal, 2); đầu tiên để đảm bảo bạn chỉ có hai chữ số dưới dạng số thập phân. Nhưng bạn không thể sử dụng điều này nếu bạn muốn tính toán chính xác hoặc xử lý tiền.
Ulrik McArdle

0

Để ngăn số thập phân dư thừa (ví dụ 50,85 - 50 cho 0,850000000852), trong trường hợp của tôi, tôi chỉ cần 2 số thập phân cho xu tiền.

$n = 50.85;
$whole = intval($n);
$fraction = $n * 100 % 100;

0

Tôi đã gặp khó khăn khi tìm cách thực sự tách biệt số đô la và số tiền sau số thập phân. Tôi nghĩ rằng tôi đã tìm ra chủ yếu và nghĩ rằng hãy chia sẻ nếu có ai trong số các bạn đang gặp khó khăn

Nên về cơ bản...

nếu giá là 1234,44 ... toàn bộ sẽ là 1234 và thập phân sẽ là 44 hoặc

nếu giá là 1234,01 ... toàn bộ sẽ là 1234 và số thập phân sẽ là 01 hoặc

nếu giá là 1234.10 ... toàn bộ sẽ là 1234 và thập phân sẽ là 10

và kể từ đó trở đi

$price = 1234.44;

$whole = intval($price); // 1234
$decimal1 = $price - $whole; // 0.44000000000005 uh oh! that's why it needs... (see next line)
$decimal2 = round($decimal1, 2); // 0.44 this will round off the excess numbers
$decimal = substr($decimal2, 2); // 44 this removed the first 2 characters

if ($decimal == 1) { $decimal = 10; } // Michel's warning is correct...
if ($decimal == 2) { $decimal = 20; } // if the price is 1234.10... the decimal will be 1...
if ($decimal == 3) { $decimal = 30; } // so make sure to add these rules too
if ($decimal == 4) { $decimal = 40; }
if ($decimal == 5) { $decimal = 50; }
if ($decimal == 6) { $decimal = 60; }
if ($decimal == 7) { $decimal = 70; }
if ($decimal == 8) { $decimal = 80; }
if ($decimal == 9) { $decimal = 90; }

echo 'The dollar amount is ' . $whole . ' and the decimal amount is ' . $decimal;

-1

Không thấy một mô đun đơn giản nào ở đây ...

$number         = 1.25;
$wholeAsFloat   = floor($number);   // 1.00
$wholeAsInt     = intval($number);  // 1
$decimal        = $number % 1;      // 0.25

Trong trường hợp này có được cả hai $wholeAs?$decimalkhông phụ thuộc vào cái kia. (Bạn chỉ có thể lấy 1 trong 3 đầu ra một cách độc lập.) Tôi đã chỉ ra $wholeAsFloat$wholeAsIntbởi vì floor()trả về một số kiểu float mặc dù số mà nó trả về sẽ luôn là số nguyên. (Điều này quan trọng nếu bạn chuyển kết quả vào một tham số hàm kiểu gợi ý.)

Tôi muốn điều này để tách một số giờ / phút dấu phẩy động, ví dụ 96,25, thành giờ và phút riêng biệt cho một phiên bản DateInterval là 96 giờ 15 phút. Tôi đã làm điều này như sau:

$interval = new \DateInterval(sprintf("PT%dH%dM", intval($hours), (($hours % 1) * 60)));

Tôi không quan tâm đến giây trong trường hợp của tôi.


-3
val = -3.1234

fraction = abs(val - as.integer(val) ) 

2
Xin chào, hãy thêm một chút giải thích cùng với mã vì nó giúp hiểu mã của bạn. Câu trả lời chỉ có mã được cau mày.
Bhargav Rao
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.