たとえば、1.25-この番号の「1」と「25」の部分を取得するにはどうすればよいですか?
小数部分が.0、.25、.5、または.75であるかどうかを確認する必要があります。
$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にすることを停止します
このコードはあなたのためにそれを分割します:
list($whole, $decimal) = explode('.', $your_number);
ここで、$ wholeは整数であり、$ decimalは小数点以下の数字になります。
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
Intとしてキャストし、減算します
$integer = (int)$your_number;
$decimal = $whole - $integer;
または、比較のために小数を取得するだけです
$decimal = $your_number - (int)$your_number
短い方法(floorとfmodを使用)
$var = "1.25";
$whole = floor($var); // 1
$decimal = fmod($var, 1); //0.25
次に、$ decimalを0、.25、.5、または.75と比較します
使用できる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
$x = 1.24
$result = $x - floor($x);
echo $result; // .24
ブラッド・クリスティの方法は本質的に正しいですが、より簡潔に書くことができます。
function extractFraction ($value)
{
$fraction = $value - floor ($value);
if ($value < 0)
{
$fraction *= -1;
}
return $fraction;
}
これは彼の方法と同等ですが、より短く、結果として理解しやすいことを願っています。
ここには単純なモジュラスはありません...
$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)));
私の場合、数秒は気にしませんでした。
余分な浮動小数(つまり、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;
常に小数点以下2桁でカウントできる場合は、文字列演算を使用できます。
$decimal = 1.25;
substr($decimal,-2); // returns "25" as a string
パフォーマンスのアイデアはありませんが、私の単純なケースでは、これははるかに優れていました...