วิธีการรับส่วนทั้งหมดและทศนิยมของตัวเลข?


100

ระบุว่า 1.25 - ฉันจะได้ส่วน "1" และ "25" ของตัวเลขนี้ได้อย่างไร

ฉันต้องการตรวจสอบว่าส่วนทศนิยมเป็น. 0, .25, .5 หรือ. 75


ระเบิดง่ายๆจะทำงานหรือไม่? $ splitDec = ระเบิด (".", $ decimal); $ splitDec [0] ตอนนี้จะคูณ 1 และ SplitDec [1] จะเป็น 25 จากตัวอย่างของคุณ
Matt

@Matt split()เลิกใช้งานแล้ว
alex

@alex เออลืมไป กำลังคิดว่าจาวาสคริปต์ เปลี่ยนเป็นระเบิด
Matt

@Matt การแยกถูกเลิกใช้งานเมื่อ PHP 5.3 และใช้ regex เป็นอาร์กิวเมนต์ในขณะที่ Explode ใช้สตริง Explode () เป็นที่ต้องการในกรณีนี้
shelhamer

4
โปรดทราบว่าexplode(".",1.10);จะให้ 1 และ 1 ไม่ใช่ 1 และ 10
มิเชล

คำตอบ:


180
$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


7
ในฐานะที่เป็นด้านข้างintval()หรือการคัดเลือกนักแสดงที่เรียบง่าย(int)อาจมีประสิทธิภาพมากกว่าfloor()
Jason McCreary

1
พื้นบัญชีสำหรับเชิงลบอย่างไร?
LanceH

@LanceH: มันไม่ได้ แต่คุณสามารถจัดการกับมันได้อย่างง่ายดายด้วยการตั้งค่าสถานะเชิงลบ
Brad Christie

4
คำตอบนี้ไม่ถูกต้องจริง ๆ เว้นแต่คุณจะเพิ่มรอบ () ฟังดูโง่ฉันรู้ แต่มันเกี่ยวข้องกับเลขคณิตลอยตัวระดับต่ำ ดูที่นี่: stackoverflow.com/questions/3726721/php-math-precision
Matt James

ลองด้วย 510.9 ผลตอบแทน 0.89 แต่ไม่สามารถบอกได้ว่าทำไม.
T30

39

รหัสนี้จะแบ่งให้คุณ:

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

โดยที่ $ whole คือจำนวนเต็มและทศนิยม $ จะมีตัวเลขอยู่หลังจุดทศนิยม


10
โปรดทราบว่าexplode(".",1.10);จะให้ 1 และ 1 ไม่ใช่ 1 และ 10
มิเชล

3
สิ่งนี้จะแบ่งและแสดงคำเตือนเกี่ยวกับดัชนีที่ไม่ได้กำหนดหากตัวเลขเป็นจำนวนเต็มหรือไม่มีส่วนทศนิยม
Andreyco

1
สิ่งนี้ถือว่าตัวเลขจะไม่สิ้นสุดลงด้วยการแสดงในสัญกรณ์ทางวิทยาศาสตร์เมื่อส่งเป็นสตริง ถ้ามันเป็นตัวเลขที่ใหญ่มากหรือน้อยจริงๆก็จะไม่เป็นเช่นนั้นและวิธีนี้จะพัง
GordonM

จะไม่ทำงานเมื่อหมายเลขของคุณคือ: $ value = 10000000000000.00011111;
Hamid Naghipour

20

แค่จะแตกต่าง :)

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

CodePadCodepad

เพื่อเป็นประโยชน์เพิ่มเติมจะแบ่งเฉพาะที่ทั้งสองด้านประกอบด้วยตัวเลข


2
อันนี้จะไม่แตกหาก number ไม่มีส่วนทศนิยม เยี่ยมมาก!
Andreyco

ดีที่ผลลัพธ์นี้ได้จำนวนเต็มสองจำนวน แทนที่จะเป็น int และ float
foochow

1
สิ่งนี้ถือว่าตัวเลขจะไม่สิ้นสุดลงด้วยการแสดงในสัญกรณ์ทางวิทยาศาสตร์เมื่อส่งเป็นสตริง ถ้ามันเป็นตัวเลขที่ใหญ่มากหรือน้อยมากก็จะไม่เป็นเช่นนั้นและวิธีนี้จะพัง
GordonM

และปริมาณนี้ไม่ได้ผลเมื่อตัวเลขเป็นเช่นนี้: $ value = 10000000000000.00011111;
Hamid Naghipour

19

เมธอด floor () ใช้ไม่ได้กับจำนวนลบ สิ่งนี้ใช้ได้ทุกครั้ง:

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

... ยังใช้งานได้กับเชิงลบ (รหัสเดียวกันหมายเลขต่างกัน):

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

เมื่อตัวเลขเป็นค่า $ = 10000000000000.00011111; มันก็ไม่ได้ผลเช่นกัน
Hamid Naghipour

9

ทางสั้น ๆ (ใช้ floor และ fmod)

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

จากนั้นเปรียบเทียบ $ decimal กับ 0, .25, .5 หรือ. 75


ฉันยอมรับคำตอบนี้! ใกล้เคียงกับ C # (a % 1)และจัดการกับจำนวนลบได้ดี
Bitterblue

7

ร่ายเป็น int และลบ

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

หรือแค่รับทศนิยมเพื่อเปรียบเทียบ

$decimal = $your_number - (int)$your_number

5

นอกจากนี้ยังมีฟังก์ชัน fmod ที่สามารถใช้ได้: fmod ($ my_var, 1) จะส่งคืนผลลัพธ์เดียวกัน แต่บางครั้งก็มีข้อผิดพลาดรอบเล็กน้อย




1

วิธีการของ Brad Christie นั้นถูกต้องเป็นหลัก แต่สามารถเขียนได้อย่างกระชับ

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

    return $fraction;
}

สิ่งนี้เทียบเท่ากับวิธีการของเขา แต่สั้นกว่าและหวังว่าจะเข้าใจง่ายขึ้น



1

หากคุณสามารถนับว่ามันมีทศนิยม 2 ตำแหน่งเสมอคุณสามารถใช้การดำเนินการสตริง:

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

ไม่มีความคิดเรื่องประสิทธิภาพ แต่สำหรับกรณีง่ายๆของฉันมันดีกว่ามาก ...


หมายเหตุ: หากคุณทำเช่นนี้อย่างน้อยคุณควรใช้ round ($ decimal, 2); ก่อนอื่นเพื่อให้แน่ใจว่าคุณมีทศนิยมสองหลักเท่านั้น แต่คุณไม่สามารถใช้สิ่งนี้ได้หากคุณต้องการมีคณิตศาสตร์ที่ถูกต้องหรือจัดการกับเงิน
Ulrik McArdle

0

เพื่อป้องกันทศนิยมทศนิยมพิเศษ (เช่น 50.85 - 50 ให้ 0.850000000852) ในกรณีของฉันฉันต้องการแค่ 2 ทศนิยมสำหรับเซ็นต์เงิน

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

0

ฉันมีช่วงเวลาที่ยากลำบากในการหาวิธีแยกจำนวนเงินดอลลาร์กับจำนวนเงินหลังทศนิยม ฉันคิดว่าฉันคิดออกเป็นส่วนใหญ่และคิดที่จะแบ่งปันหากมีปัญหาใด ๆ

โดยพื้นฐานแล้ว ...

ถ้าราคาคือ 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;

-1

ไม่เห็นโมดูลัสธรรมดาที่นี่ ...

$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)));

ฉันไม่สนใจวินาทีในกรณีของฉัน


-3
val = -3.1234

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

2
สวัสดีโปรดเพิ่มคำอธิบายเล็กน้อยพร้อมกับรหัสเพื่อช่วยให้เข้าใจรหัสของคุณ รหัสคำตอบเท่านั้นที่ขมวดคิ้ว
Bhargav Rao
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.