数値の整数部と小数部を取得するにはどうすればよいですか?


98

たとえば、1.25の場合、この数値の「1」と「25」の部分を取得するにはどうすればよいですか。

小数部が.0、.25、.5、または.75かどうかを確認する必要があります。


単純な爆発は機能しますか?$ splitDec = explode( "。"、$ decimal); $ splitDec [0]が1で、splitDec [1]が25になります。
Matt

@Matt split()は非推奨になりました。
アレックス2011

@alexええ、忘れました。JavaScriptを考えていました。爆発するように変更。
Matt

@ Matt、splitはPHP 5.3で非推奨になり、実際には正規表現を引数として使用しますが、explodeは文字列を使用します。この場合、explode()が推奨されます。
シェルハマー、2011

4
explode(".",1.10);ウィルは1と1ではなく1と1を与えることに注意してください
ミシェル

回答:


177
$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、2011

1
フロアはネガティブをどのように説明しますか?
LanceH

@LanceH:そうではありませんが、負のフラグを使用してかなり簡単に処理できます。
ブラッドクリスティ

4
この答えは、round()を追加しない限り実際には不正確です。馬鹿げているように聞こえますが、それは低レベルの浮動小数点数の計算に関係しています。こちらをご覧ください:stackoverflow.com/questions/3726721/php-math-precision
Matt James

510.9で試して、0.89を返します。しかし、理由はわかりません。
T30

38

このコードはあなたのためにそれを分割します:

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

ここで、$ wholeは整数で、$ decimalは小数点の後に数字が入ります。


9
explode(".",1.10);ウィルは1と1ではなく1と1を与えることに注意してください
ミシェル

3
これは、numberが整数であるか、小数部が含まれていない場合、未定義のインデックスについて壊れて警告をスローします。
Andreyco 2013年

1
これは、数値が文字列にキャストされたときに、科学表記法で表現されないことを前提としています。それが本当に非常に大きいか本当に本当に小さい数であるならば、これは事実ではなく、この方法は壊れます。
GordonM

20

ただ違う:)

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

CodePad

追加の利点として、両側が数字で構成されている場合にのみ分割されます。


2
数値に小数部が含まれていない場合、これは壊れません。すごい!
Andreyco 2013年

これが2つの整数を出力するのは素晴らしいことです。intとfloatではなく。
foochow

1
これは、数値が文字列にキャストされたときに、科学表記法で表現されないことを前提としています。それが本当に非常に大きいか本当に本当に小さい数であるならば、これは事実ではなく、この方法は壊れます。
GordonM、2015年

18

floor()メソッドは負の数に対しては機能しません。これは常に機能します:

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

...ネガにも機能します(同じコード、異なる番号):

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

8

短い方法(floorとfmodを使用)

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

次に、$ decimalを0、.25、.5、または.75と比較します


私はこの答えを受け入れます!C#に近く、(a % 1)負の数も適切に処理します。
ビターブルー

7

intとしてキャストして減算

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

または、比較のために小数を取得する

$decimal = $your_number - (int)$your_number

5

使用できるfmod関数もあります。fmod($ my_var、1)は同じ結果を返しますが、小さな丸いエラーが発生することがあります。


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


1

ブラッドクリスティーの方法は本質的に正しいですが、より簡潔に書くことができます。

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);を使用する必要があります。まず、10進数として2桁しかないことを確認します。しかし、正しい計算をしたい、またはお金を処理したい場合は、これを使用できません。
Ulrik McArdle

0

余分な浮動小数点(つまり、50.85-50は0.850000000852を与える)を防ぐために、私の場合、お金のセントに2つの小数点が必要です。

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

0

ドルの金額と小数点以下の金額を実際に分離する方法を見つけるのに苦労していました。私はほとんどそれを理解し、yallのいずれかが問題を抱えている場合は共有することを考えた

だから基本的に...

価格が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し、もう一方に依存しません。(あなただけの独立して3つの出力の1を取ることができます。)私が示されてきた$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.