やりたいこと
ある桁数以下は切り捨てて、それより上の桁数で値を返したかった。
例えば、小数点第三位以下は切り捨てて、小数点第二位までを返したい。
課題
ググると、 floor
と sprintf
と number_format
があるよう。
floor
だと小数点以下の切り捨てて整数にするのみで、桁数の指定はできない。
sprintf
と number_format
なら、小数点以下の桁数を指定するだけなので簡単そう!と思ったが、よくよく調べてみると、なぜか四捨五入されてしまうらしい。
結論
結局、完全な切り捨てを行いたいなら floor
を工夫して使うのが良さそうという結論に辿り着いた。
イメージは、元の数値を割って小数点の位置を左にズラしてから floor
で小数点以下を切り捨てて、割った数分、倍にすれば良い。
例えば、小数第三位以下は切り捨てたいなら、ある数値を100倍してからfloor
で切り捨てて、その後で100で割って、小数第二位までに戻す。
-
もし元の数字の小数点以下の桁数が動的であれば、その数字に
number_format
かsprintf
で桁数を揃えてから(小数点第二位までにしたければ、第三位までを一旦揃える)、floor
を使って切り捨てれば良さそう。 -
もし元の数字の小数点以下の桁数が動的であれば、その数字に
number_format
かsprintf
で桁数を揃えてから、floor
を使って切り捨てれば良さそう。
下記のサンプルコードは下記サイトから引用。
<?php
// 小数第一位で切り捨て
print floor(2.26); // 2
// 小数第一位で切り捨て
print floor(2.82); // 2
// マイナスの場合
print floor(-2.82); // -3
// 小数第二位で切り捨て
print (floor(12.262 * 10) / 10); // 12.2
// 小数第三位で切り捨て
print (floor(12.262 * 100) / 100); // 12.26
// 1の位で切り捨て
print (floor(122.2 / 10) * 10); // 120
// 10の位で切り捨て
print (floor(122.2 / 100) * 100); // 100
?>
小数第二位で切り捨てています。以下の操作です。
1.対象の値に10を掛けます。(12.262 * 10 = 122.62)
2.floorメソッドを使用して小数点以下を切り捨てます。(122.62 → 122)
3.対象の値を再度10で割ります。(122 / 10 = 12.2)
number_formatとsprintfの挙動
number_format
number_format(
float $num,
int $decimals = 0,
?string $decimal_separator = ".",
?string $thousands_separator = ","
): string
num
フォーマットする数値。
decimals
小数点以下の桁数。 0
を指定すると、 返り値の decimal_separator
は省略されます。
decimal_separator
小数点を表す区切り文字。
thousands_separator
千の位毎の区切り文字。
$number = 1234.56;
// 英語での表記 (デフォルト)
$english_format_number = number_format($number);
// 1,235
$number = 1234.5678;
// 千位毎の区切りがない英語での表記
$english_format_number = number_format($number, 2, '.', '');
// 1234.57 // ここ四捨五入されてる
PHPで小数点以下を2桁とか3桁に切り捨てる2つの方法 | PisukeCode - Web開発まとめ
なぜか四捨五入されてる。切り捨てたい。
sprintf
sprintfとprintfの違いは、sprintfはフォーマットされた値が戻り値。printfはフォーマットされた値を標準出力する。
$num1 = 10;
$num2 = 1000.5;
$num3 = 0.456789;
echo sprintf('%.2f',$num1),PHP_EOL;
echo sprintf('%.2f',$num2),PHP_EOL;
echo sprintf('%.2f',$num3),PHP_EOL;
/*
10.00
1000.50
0.46 // ここがなぜか四捨五入されてる。
*/
なぜか四捨五入されてしまう場合もあるので、切り捨て対時は使えなさそう。