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.
split()
đã không được dùng nữa.
explode(".",1.10);
wil cho 1 và 1, không 1 và 10
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.
split()
đã không được dùng nữa.
explode(".",1.10);
wil cho 1 và 1, không 1 và 10
Câu trả lời:
$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 $returnUnsigned
dừng lại nó từ làm -1,25 để -1 & -0.25
intval()
hoặc đúc đơn giản như (int)
có thể được nhiều hơn performant hơnfloor()
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.
explode(".",1.10);
wil cho 1 và 1, không 1 và 10
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ố.
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
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
(a % 1)
VÀ nó xử lý tốt các số âm.
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
Đây là cách tôi sử dụng:
$float = 4.3;
$dec = ltrim(($float - floor($float)),"0."); // result .3
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.
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 ...
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;
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?
và $decimal
khô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
và $wholeAsInt
bở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.
val = -3.1234
fraction = abs(val - as.integer(val) )