(注:Math::Currencyがありますが、現在壊れています)。
Math::BigFloat
を使用して任意の精度のオブジェクトとして数値を表します。
use Math::BigFloat;
print Math::BigFloat->new(0.1) +
Math::BigFloat->new(0.1) +
Math::BigFloat->new(0.1) == Math::BigFloat->new(0.3);
あなたはbignum
...
use bignum;
print 0.1 + 0.1 + 0.1 == 0.3;
と、自動的にこれを行うことができますが!魔法はの番号にしか作用しません。一緒に文字列を追加しようとすると、それは動作しません、魔法は遅すぎます。明示的に数字にする必要があります。文字列を数値化するには、$a += 0
のように文字列に0を加えることができます。または、式を0 +
で始めることによってbignumsとして強制することができます。これにより、行がカスケードされます。
use bignum;
$a = "0.1";
$b = "0.1";
$c = "0.1";
$d = "0.3";
# False
print $a + $b + $c == $d;
# True
print 0 + $a + $b + $c == $d;
2つの注意点。
まず、このすべてが大きなパフォーマンスコストになります。任意の精度の計算を行うだけでなく、すべてのメソッドとオーバーロードマジックのために。これが許容可能かどうかを判断するためにベンチマークしてください。幸いにもbignum
は、プログラム全体ではなく、そのスコープ内の数字だけをアップグレードします。 bignum
のスコープ外の数字を使用することも安全です。それらの数字もアップグレードされます。
次に、Decimalは有効数字を保持します。 Math :: BigFloatはできません。
Math :: BigRatとMath :: Decimalはこのトリックを行います。 – ikegami
小数点および整数から引用符を削除します。 –
@Missaka Wijekoon、引用符は無害です。あなたはその点を欠いている。 'perl -E'say 0.1 + 0.1 + 0.1 == 0.3を試してみてください。 "equal": "not equal" '' – ikegami