web-dev-qa-db-ja.com

数値の整数部と小数部を取得する方法は?

たとえば、1.25-この番号の「1」と「25」の部分を取得するにはどうすればよいですか?

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

86
$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にすることを停止します

151
Brad Christie

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

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

ここで、$ wholeは整数であり、$ decimalは小数点以下の数字になります。

34
shelhamer

ただ違うために:)

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

CodePad

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

19
alex

Floor()メソッドは、負の数では機能しません。これは毎回機能します:

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

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

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

Intとしてキャストし、減算します

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

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

$decimal = $your_number - (int)$your_number
6
Dom

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

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

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

6
mpalencia

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

4
ip512

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
3
Vasil Nikolov

これは私が使用する方法です:

$float = 4.3;    

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

$result = $x - floor($x);

echo $result; // .24
1
Stnfordly

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

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

    return $fraction;
}

これは彼の方法と同等ですが、より短く、結果として理解しやすいことを願っています。

1
GordonM

ここには単純なモジュラスはありません...

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

この場合、$wholeAs?$decimalの両方を取得することは、他方に依存しません。 (3つの出力のうち1つを個別に取得できます。) floor() が返すため、$wholeAsFloatおよび$wholeAsIntを示しました。戻り値が常に整数であっても、float型の数値。 (これは、結果を型ヒント関数のパラメーターに渡す場合に重要です。)

私はこれが時間/分の浮動小数点数を分割することを望みました、例えば96.25(96時間15分として DateInterval インスタンスの時間と分に個別に)。これを次のように行いました。

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

私の場合、数秒は気にしませんでした。

0
Adambean

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

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

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

だから基本的に...

価格が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;
0
Julie

常に小数点以下2桁でカウントできる場合は、文字列演算を使用できます。

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

パフォーマンスのアイデアはありませんが、私の単純なケースでは、これははるかに優れていました...

0
Ben Barreth