rspec big decimal matcher
-:total_cost_with_tax => #<BigDecimal:7fda9d17aaf0,'0.105225E4',18(45)>,
-:total_cost_without_tax => #<BigDecimal:7fda9d17b450,'0.972E3',9(36)>,
-:total_last_installment_amount => #<BigDecimal:7fda9d17b978,'0.8011E2',18(45)>,
-:total_monthly_installment_amount => #<BigDecimal:7fda9d17abb8,'0.8011E2',18(45)>,
-:total_tax => #<BigDecimal:7fda9d17b068,'0.8025E2',18(45)>,
+:total_cost_with_tax => #<BigDecimal:7fda9d0184c8,'0.105225E4',18(36)>,
+:total_cost_without_tax => #<BigDecimal:7fda91ff2b48,'0.972E3',9(27)>,
+:total_last_installment_amount => #<BigDecimal:7fda91fee548,'0.8011E2',18(36)>,
+:total_monthly_installment_amount => #<BigDecimal:7fda91fe72c0,'0.8011E2',18(36)>,
+:total_tax => #<BigDecimal:7fda9d00a2b0,'0.8025E2',18(36)>,
So, diese übersät sind, während einige von meinen tests... rspec 2, rails 3. Ich Vergleiche hashes mit .should eq()
zu vergleichen. Ich kann nicht scheinen, um die Beschwörung Recht. Wie es scheint, ist ein Präzisions-Ding, das erscheint mir dumm.
Du musst angemeldet sein, um einen Kommentar abzugeben.
RSpec 3 hat BigDecimal-eq:
Wenn Sie den Vergleich ein BigDecimal Float, bewusst sein, kann die Genauigkeit beeinflussen Vergleich.
Diese:
Wenn Sie vergleichen zwei BigDecimal-zahlen, die haben unterschiedliche Genauigkeiten, bewusst sein, dass diese zahlen zeigen, können unterschiedliche Ergebnisse aus
inspect
und auch vonhash
je nach Plattform ist und welche version von Ruby BigDecimal sind.Beispielsweise kann dies passieren:
Ihre Ausgabe zeigt, dass Ihr BigDecimal string-Darstellungen sind etwas anders.
Hier ist, was die Saiten bedeuten:
Ihre Ausgabe zeigt, dass die Saiten haben unterschiedliche Objekt-Adressen, identische Anzahl Werte (also Teil 2), identisch signifikante stellen (die erste Zahl in Teil 3), aber eine unterschiedliche Anzahl von maximalen signifikanten stellen.
Für Ihre Frage, mit RSpec 2 und vergleichen
BigDecimal
hashes, Sie lösen Ihr Problem mit rspecbe_within
matcher.Beachten Sie, dass Ruby
BigDecimal
zahlen undFloat
zahlen sind sowohl floating-point-zahlen:Einen
BigDecimal
ist eine beliebige Präzision dezimale floating-point-Zahl.Einen
Float
ist die native Architektur des double-precision binary floating-point-Zahl.Sehen Sie die
BigDecimal
dezimalen Gleitkomma-Darstellung zu tun:Die Mantisse Teil ist '0.1', und der exponent Teil ist 'E3'.
Beachten Sie, dass dies für die typische Ruby MRI/KRI-VM. Implementierungen unterschiedlich sein können, die auf anderen Ruby-VM, wie JRuby, weil Java hat seine eigene bignum-code.
Wenn Sie vergleichen zwei verschiedene Arten von floating-point-zahlen, wie BigDecimal Float, erhalten Sie Ergebnisse, die scheinen mag counter-intuitive, weil die Typen zu verwenden, verschiedene Basen (dezimal und Binär), unterschiedliche Genauigkeiten und unterschiedlichen Ruby-Klassen.
Beispiel:
be_within
passt BegDecimal. Es ist nicht wie ein Float; Sie brauchen nicht zu berücksichtigen, für Rundungsfehler wegen der Art, wie die Nummer gespeichert ist.Mit Rspec 3.x, die Sie verwenden können, für BigDecimal die
eq
matcher wie Sie können es verwenden, für float.Weitere Informationen finden Sie in der RSpec-Dokumentation:
https://www.relishapp.com/rspec/rspec-expectations/v/3-4/docs/built-in-matchers/equality-matchers