php-予期しないround()が返される
PHPのround()関数を使用して数値を切り捨てようとしています。私が使用しているコードは次のとおりです:
$line_item_price = 13.775;
echo round($line_item_price, 2, PHP_ROUND_HALF_DOWN);
このようなコードを実行すると、0(または何も表示されない-どちらかはまだわかりません)を除いて、出力13.77を取得したいと思っています。
PHP_ROUND_HALF_DOWNを削除すると、13.78になります。誰かが私がここで間違っていることを見ますか?これは正しく機能しているようです。
答え :
解決策:
現在のバージョンのPHPではまだ使用できない関数を使用しています。この問題を解決する1つの方法は、 floor
関数を使用することです。
$ line_item_price = 13.775;
echo floor($ line_item_price * 100)/ 100;
ここで行っているのは、最初に値に100を掛けてから、その値をfloorすることです。これにより、精度2の切り捨てられた値が得られます。次に、正しい値を取得するには、100で割り込む必要があります。
100という数字はpower(10, desired precision)
に由来します
答え :
解決策:
あなたはただできることはできません:
echo round($line_item_price, 2)
?
100%確信はありませんが、ROUND_HALF_DOWNなどは1.5、2.5、整数などの分数用だと思います。
答え :
解決策:
これを行う方法は次のとおりです:
$num = 13.775; $tmp = intval($num*1000); $dec = $tmp % 10; if ($dec > 5) { $rounded = (1+intval($tmp/10))/100; } else { $rounded = intval($tmp/10)/100; } echo $rounded,"\n";
が得られます。 >これにより、
$ num = 13.77 5
および13.78
13.77$ num = 13.77 6 の場合
答え :
解決策:
実際には、13.775という数値は浮動小数点で正確に表現できないため、まったく機能しないことに少し驚いています。
$ php -r 'printf("%.40f\n", 13.775);'
13.7750000000000003552713678800500929355621
確かに、 round() は、「半分」と見なされるものについて少し緩いようです:
$ php -r 'echo round(13.77500000000001, 2, PHP_ROUND_HALF_DOWN) . "\n";'
13.77
とにかく、PHPが PHP_ROUND_HALF_DOWN をサポートしていない場合は、ほぼ同じ機能を提供する単純なklugeを次に示します。
function round_half_down ( $num, $digits ) {
$mul = pow( 10, $digits );
return ceil( $num * $mul - 0.5 ) / $mul;
}
これは単純に期待どおりに機能することがわかりますが、 round() : round_half_down(13.775, 2) == 13.77 よりも少し厳密ですが、< code> round_half_down(13.77500000000001, 2) == 13.78
。また、奇妙なエッジケースとして、 round_half_down(0.001, 2)
は-0
を返します。それが気に入らない場合は、いつでも戻り値を sprintf("%.{$digits}F") に渡して、適切にフォーマットすることができます。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。