2017-01-03 10 views
4

2つの数値が同じであることがわかるように、任意の精度で比較を行うにはどうすればよいですか? Pythonでは、round()のような関数を使用するので、Rustに相当するものを探しています。錆の2つのフロートと任意の精度レベルの比較

は、例えば、私が持っている:私の場合は

let x = 1.45555454; 
let y = 1.45556766; 

が、彼らは小数点以下2桁まで似ています。したがって、xyは、比較の目的で1.46になります。

if x == y { // called when we match to 2 decimal places} 

はさらなる問題を解明し、いくつかのコンテキストを与える:私はこれらをフォーマットすることができますが、それは確かに遅いので、等価性をチェックするための最良の錆方法、何です。これは本当にドルとセントの正確さです。したがって、通常pythonには、すべての問題を伴うround()関数を使用します。はい、私は浮動小数点表記の限界を認識しています。金額を計算する2つの関数があります。私はドルで計算し、セントの部分を最も近いペニーに処理する必要があります。

コミュニティに聞く理由は、私が自分自身を転がすと、パフォーマンスに打ち勝つことができ、それがこの側面です - なぜ私はRustを採用しているのでしょうか?プラス私は錆のドキュメントでround()と呼ばれるものを見ましたが、pythonsのバージョンとは異なり、ゼロのパラメータを取るようです。

+0

http://stackoverflow.com/q/18686269/155423およびhttp://floating-point-gui.de/ – Shepmaster

+1

@Shepmaster:「ラウンド」の言葉を考えると、私は後者それは... OPが望むものではないでしょう。 –

+0

私は錆は分かりませんが、 'xy <0.002'のようなことをすることができます –

答えて

5

Pythonドキュメントから:山車のためround()

注動作が驚くことができます。たとえば、round(2.675, 2)ではなく、予想2.682.67を与えます。これはバグではありません。大部分の小数部分を浮動小数点として正確に表すことはできません。

詳細については、What Every Programmer Should Know About Floating-Point Arithmeticを参照してください。


あなたはコンピュータが浮動ポイントをどのように扱うか理解していない場合、このコードを使用しないでください。

  • 十分に大きな浮き:このコードで破壊することが知られている(あるいはそう)されているものの

    fn approx_equal(a: f64, b: f64, decimal_places: u8) -> bool { 
        let factor = 10.0f64.powi(decimal_places as i32); 
        let a = (a * factor).trunc(); 
        let b = (b * factor).trunc(); 
        a == b 
    } 
    
    fn main() { 
        assert!(approx_equal(1.234, 1.235, 1)); 
        assert!(approx_equal(1.234, 1.235, 2)); 
        assert!(!approx_equal(1.234, 1.235, 3)); 
    } 
    

    非網羅リスト:あなたがに自分自身を取得しているどのようなトラブルがわかっている場合点の数及び/又は小数点数

  • 非正規化数
  • のNaN
  • 無限大
  • ゼロに近いの
  • 値(approx_equal(0.09, -0.09, 1)

潜在的な代替は、固定小数点または任意精度のタイプのいずれかを使用することである遅いが大多数の、より論理的に一貫性があるとしているいずれもの人間。

+2

注:この関数は、十分に大きな浮動小数点数/十進数の組み合わせに対しては正しくない可能性があります。結局のところ 'f64'の仮数は52ビットしかありません。 –

+2

ああ、およそ0の周りの振る舞いは変わっている可能性があります。 'approx_equal(0.09、-0.09、1)'は 'true'を返します。 –

+1

ありがとう、私は何かを見つけることを期待していたが、私はこの道を行くように見えます。 – disruptive

関連する問題