【PHP】浮動小数点を切り捨てたい

公開日:2019-03-15
最終更新:2019-03-15

目的

  • 商を求めた時の小数点をある桁数まで丸めたい(例示では第3位)

結論

  • round を使用する
$data = 2000 / 31;  
var_dump($data);  
# float(64.516129032258)  

$data = round($data, 3, PHP_ROUND_HALF_DOWN); # 今回は切り捨て  
var_dump($data);  
# float(64.516)

追記

上記のソースコードでいくつかのコードをテストしたところ、バグが出た。

実行コード

    $val = 2000 / 31;  
    echo "$val\n";  
    if (64.516  === round($val, 3, PHP_ROUND_HALF_DOWN)){echo "True!\n";} else {echo "False!\n";};  
    $val = 3000 / 31;  
    echo "$val\n";  
    if (96.774  === round($val, 3, PHP_ROUND_HALF_DOWN)){echo "True!\n";} else {echo "False!\n";};  
    $val = 4000 / 31;  
    echo "$val\n";  
    if (129.032 === round($val, 3, PHP_ROUND_HALF_DOWN)){echo "True!\n";} else {echo "False!\n";};  
    $val = 7000 / 31;  
    echo "$val\n";  
    if (225.806 === round($val, 3, PHP_ROUND_HALF_DOWN)){echo "True!\n";} else {echo "False!\n";};  
    $val = 8000 / 31;  
    echo "$val\n";  
    if (258.064 === round($val, 3, PHP_ROUND_HALF_DOWN)){echo "True!\n";} else {echo "False!\n";};  
    $val = 13000 / 31;  
    echo "$val\n";  
    if (419.354 === round($val, 3, PHP_ROUND_HALF_DOWN)){echo "True!\n";} else {echo "False!\n";};  
    $val = 15000 / 31;  
    echo "$val\n";  
    if (483.870 === round($val, 3, PHP_ROUND_HALF_DOWN)){echo "True!\n";} else {echo "False!\n";};  
    $val = 20000 / 31;  
    echo "$val\n";  
    if (645.161 === round($val, 3, PHP_ROUND_HALF_DOWN)){echo "True!\n";} else {echo "False!\n";};  
    $val = 25000 / 31;  
    echo "$val\n";  
    if (806.451 === round($val, 3, PHP_ROUND_HALF_DOWN)){echo "True!\n";} else {echo "False!\n";};

結果

64.516129032258  
True!  
96.774193548387  
True!  
129.03225806452  
True!  
225.8064516129  
True!  
258.06451612903  
False!  
419.35483870968  
False!  
483.87096774194  
False!  
645.16129032258  
True!  
806.45161290323  
False!

小数点第4位が5以上の場合、切り捨てになっていない。

解決策

$val = 2000 / 31;  
$thousand_times_val = floor($val * 1000);  // 1000倍にして、それ以降の小数点を切り捨て  
$rounded_val = $thousand_times_val / 1000; // 再度1000分の1にして小数点第3位まで表現  

// float(64.516129032258)  
// float(64516)  
// float(64.516)

参考サイト

技術ブログ

このログについているタグ

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする