1

浮動小数点数を使用して、ユーザー定義の「ビン」サイズに応じて切り捨てたいと思います。したがって、ビンのサイズはユーザーの好みに応じて変化します。たとえば、ビンのサイズは、0.5、0.1、1、さらには 0.01 の場合があります。

私の目的は、浮動小数点数がどのビンに入るかを判断することです。例として:

0.1 ビン サイズ:

2348.285 will fall into a 2348.2 bin

238.592 will fall into a 238.5 bin

0.5 ビン サイズ:

2348.285 will fall into a 2348.0 bin

238.592 will fall into a 238.5 bin

0.01 ビン サイズ:

2348.285 will fall into a 2348.28 bin

238.592 will fall into a 238.59 bin

1 ビン サイズ:

2348.285 will fall into a 2348 bin

238.592 will fall into a 238 bin

たとえば、perl での floor()、sprintf()、および substr() メソッドの丸めを調べましたが、それらのどれも私がやりたいことをまったく望んでいません。欲しいです。ユーザー定義のビン サイズを指定して、浮動小数点数が切り捨てられるフロア値を動的に変更する適切なコードはどれですか?

4

2 に答える 2

5

Math::Roundを試すことができます:

use Math::Round 'nlowmult';

print nlowmult( .01, 2348.285 ) . "\n";
print nlowmult( .01, 238.592 ) . "\n";
于 2013-10-29T22:56:51.900 に答える
1

いくつかの癖を条件として、切り捨てから任意のビンサイズへの式は次のとおりです。

use POSIX 'floor';

$bin = $bin_size * floor( $value / $bin_size )

(たとえば)への24.01 / 0.01 => 2400.99999999999996758 =>ラウンドの回避策は、次のように入力を混乱させることです2400

$epsilon = 1.0e-12;

$bin = $bin_size * floor( ($value+$epsilon) / $bin_size)

また

$bin = $bin_size * floor( $value / $bin_size + $epsilon )

1/$bin_sizeで割るよりも を掛けた方が運が良いかもしれないことに注意してください$bin_size。たとえば、値を使用した浮動小数点演算0.1が問題を引き起こす可能性があることを確認したため、計算$value * 10によって予想外の結果が得られることはめったにありません$value / 0.1

24.01 - $epsilon(しかし、実際の入力が24.00 に切り捨てられる場合の回避策は何ですか?)

于 2013-10-29T22:57:49.173 に答える