ระบุว่า 1.25 - ฉันจะได้ส่วน "1" และ "25" ของตัวเลขนี้ได้อย่างไร
ฉันต้องการตรวจสอบว่าส่วนทศนิยมเป็น. 0, .25, .5 หรือ. 75
ระบุว่า 1.25 - ฉันจะได้ส่วน "1" และ "25" ของตัวเลขนี้ได้อย่างไร
ฉันต้องการตรวจสอบว่าส่วนทศนิยมเป็น. 0, .25, .5 หรือ. 75
split()
เลิกใช้งานแล้ว
explode(".",1.10);
จะให้ 1 และ 1 ไม่ใช่ 1 และ 10
คำตอบ:
$n = 1.25;
$whole = floor($n); // 1
$fraction = $n - $whole; // .25
จากนั้นเปรียบเทียบกับ 1/4, 1/2, 3/4 ฯลฯ
ในกรณีของจำนวนลบให้ใช้สิ่งนี้:
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
);
}
$returnUnsigned
หยุดมันจากการทำ-1.25ใน -1และ-0.25
intval()
หรือการคัดเลือกนักแสดงที่เรียบง่าย(int)
อาจมีประสิทธิภาพมากกว่าfloor()
รหัสนี้จะแบ่งให้คุณ:
list($whole, $decimal) = explode('.', $your_number);
โดยที่ $ whole คือจำนวนเต็มและทศนิยม $ จะมีตัวเลขอยู่หลังจุดทศนิยม
explode(".",1.10);
จะให้ 1 และ 1 ไม่ใช่ 1 และ 10
แค่จะแตกต่าง :)
list($whole, $decimal) = sscanf(1.5, '%d.%d');
CodePadCodepad
เพื่อเป็นประโยชน์เพิ่มเติมจะแบ่งเฉพาะที่ทั้งสองด้านประกอบด้วยตัวเลข
เมธอด floor () ใช้ไม่ได้กับจำนวนลบ สิ่งนี้ใช้ได้ทุกครั้ง:
$num = 5.7;
$whole = (int) $num; // 5
$frac = $num - $whole; // .7
... ยังใช้งานได้กับเชิงลบ (รหัสเดียวกันหมายเลขต่างกัน):
$num = -5.7;
$whole = (int) $num; // -5
$frac = $num - $whole; // -.7
ทางสั้น ๆ (ใช้ floor และ fmod)
$var = "1.25";
$whole = floor($var); // 1
$decimal = fmod($var, 1); //0.25
จากนั้นเปรียบเทียบ $ decimal กับ 0, .25, .5 หรือ. 75
(a % 1)
และจัดการกับจำนวนลบได้ดี
ร่ายเป็น int และลบ
$integer = (int)$your_number;
$decimal = $your_number - $integer;
หรือแค่รับทศนิยมเพื่อเปรียบเทียบ
$decimal = $your_number - (int)$your_number
นอกจากนี้ยังมีฟังก์ชัน fmod ที่สามารถใช้ได้: fmod ($ my_var, 1) จะส่งคืนผลลัพธ์เดียวกัน แต่บางครั้งก็มีข้อผิดพลาดรอบเล็กน้อย
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
นี่คือวิธีที่ฉันใช้:
$float = 4.3;
$dec = ltrim(($float - floor($float)),"0."); // result .3
วิธีการของ Brad Christie นั้นถูกต้องเป็นหลัก แต่สามารถเขียนได้อย่างกระชับ
function extractFraction ($value)
{
$fraction = $value - floor ($value);
if ($value < 0)
{
$fraction *= -1;
}
return $fraction;
}
สิ่งนี้เทียบเท่ากับวิธีการของเขา แต่สั้นกว่าและหวังว่าจะเข้าใจง่ายขึ้น
$x = 1.24
$result = $x - floor($x);
echo $result; // .24
หากคุณสามารถนับว่ามันมีทศนิยม 2 ตำแหน่งเสมอคุณสามารถใช้การดำเนินการสตริง:
$decimal = 1.25;
substr($decimal,-2); // returns "25" as a string
ไม่มีความคิดเรื่องประสิทธิภาพ แต่สำหรับกรณีง่ายๆของฉันมันดีกว่ามาก ...
เพื่อป้องกันทศนิยมทศนิยมพิเศษ (เช่น 50.85 - 50 ให้ 0.850000000852) ในกรณีของฉันฉันต้องการแค่ 2 ทศนิยมสำหรับเซ็นต์เงิน
$n = 50.85;
$whole = intval($n);
$fraction = $n * 100 % 100;
ฉันมีช่วงเวลาที่ยากลำบากในการหาวิธีแยกจำนวนเงินดอลลาร์กับจำนวนเงินหลังทศนิยม ฉันคิดว่าฉันคิดออกเป็นส่วนใหญ่และคิดที่จะแบ่งปันหากมีปัญหาใด ๆ
โดยพื้นฐานแล้ว ...
ถ้าราคาคือ 1234.44 ... ทั้งหมดจะเป็น 1234 และทศนิยมจะเป็น 44 หรือ
ถ้าราคาคือ 1234.01 ... ทั้งหมดจะเป็น 1234 และทศนิยมจะเป็น 01 หรือ
ถ้าราคาคือ 1234.10 ... ทั้งหมดจะเป็น 1234 และทศนิยมจะเป็น 10
และอื่น ๆ
$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;
ไม่เห็นโมดูลัสธรรมดาที่นี่ ...
$number = 1.25;
$wholeAsFloat = floor($number); // 1.00
$wholeAsInt = intval($number); // 1
$decimal = $number % 1; // 0.25
ในกรณีนี้ได้รับทั้งสองอย่าง$wholeAs?
และ$decimal
ไม่ขึ้นอยู่กับสิ่งอื่น (คุณสามารถใช้ 1 ใน 3 เอาต์พุตแยกกัน) ฉันได้แสดง$wholeAsFloat
และ$wholeAsInt
เนื่องจากfloor()
ส่งคืนหมายเลขประเภทลอยแม้ว่าจำนวนที่ส่งคืนจะเป็นจำนวนเต็มเสมอ (นี่เป็นสิ่งสำคัญหากคุณส่งผลลัพธ์ไปยังพารามิเตอร์ฟังก์ชันคำใบ้ชนิด)
ฉันต้องการให้สิ่งนี้แบ่งจำนวนจุดลอยตัวของชั่วโมง / นาทีเช่น 96.25 เป็นชั่วโมงและนาทีแยกกันสำหรับอินสแตนซ์DateIntervalเป็น 96 ชั่วโมง 15 นาที ฉันทำสิ่งนี้ดังนี้:
$interval = new \DateInterval(sprintf("PT%dH%dM", intval($hours), (($hours % 1) * 60)));
ฉันไม่สนใจวินาทีในกรณีของฉัน
val = -3.1234
fraction = abs(val - as.integer(val) )