2010-06-17 11 views

Antwort

44

Dieses Argument hat immer zwei Seiten - Dezimalzahlen und Ganzzahlen. Befürworter von Ganzzahlen argumentieren, dass Dezimalstellen möglicherweise nicht genau sind (wenn Konvertierungen durchgeführt werden) und dass die BigDecimal-Implementierung Fehler enthält, manchmal sogar Segfaulting.

Für mein eigenes Projekt, hob ich auch ganze Zahlen auf, wickelte sie in einen benutzerdefinierten Container und konvertierte Cents in "echte" Beträge und zurück. Zuerst schien es nett, nach einer Weile wurde es wirklich umständlich zu verwenden - Tracking, wenn Sie mit Cents umgehen, wenn mit formatierten Strings usw.

Dann ich wieder auf Dezimalzahlen - das gleiche Format die ganze Zeit, kann ich leicht konvertieren die Menge zu Cent, wenn nötig, bekomme ich die verschiedenen Rundungsalgorithmen aus der Box. Ich bin sehr viel zufriedener mit Dezimalzahlen.

Und die Fragen über Dezimalzahlen Adresse nicht genau zu sein - wenn Sie, dass googeln möglicherweise feststellen meisten Fehler zu konvertieren Dezimalzahlen in Schwimmern verbunden sind :) Wie Schraubstock bereits zuvor erwähnt, sind Schwimmer nicht richtig, und Sie sollten nie nie Konvertiere deine Dezimalzahl in eine Gleitkommazahl. Das ist die wichtigste Sache, die Sie im Umgang mit Dezimalzahlen beachten müssen - Sie wollen die Genauigkeit nicht durch Konvertierungen verlieren. Oh, und ich habe noch nie irgendwelche Fehler mit Ruby 1.8.7, 1.8.7 und 1.9.1 bei der Verwendung von BigDecimal extensiv aufgetreten.

+6

+1 "nie konvertieren Sie Ihre Dezimalzahl zu einem float" ... seltsame Dinge passieren – tybro0103

10

Kommt drauf an.

Wenn Sie Berechnungen für Einkaufspreise durchführen, verwenden Sie eine Dezimalzahl.
Wenn Sie technische Mathematik durchführen, verwenden Sie einen Float.
Wenn Sie nur die Daten speichern, verwenden Sie eine Zeichenfolge.

52
add_column :table, :price, :decimal, :precision => 8, :scale => 2 

Der obige Code wäre Ihre beste Wette.

+0

Wie mache ich es in der Befehlszeile? Ich tippte "Schienen generieren Gerüst Produktpreis: Dezimal" und es erstellt eine Spalte mit: Maßstab 1. –

+2

Je nach Ihren Bedürfnissen, möchten Sie möglicherweise hinzufügen -> add_column: Tabelle,: Währung,: string,: default => 'USD ' – Tom

+0

Ist das Rails 3? rails g migration AddPriceToYourModel Preis: dezimal dann gehe zur generierten Migration und füge die Details hinzu. – Tom

7

Ich empfehle die Verwendung von Ganzzahlen für Preise, wenn möglich. Viele populäre Edelsteine ​​(wie ActiveMerchant, Money) setzen die Verwendung von Ganzzahlen voraus, und es ist oft besser, Maßeinheiten in einer Basiseinheit (wie etwa Cent) zu speichern.

+0

aber ganze Zahlen hat keine 13,25? –

+4

Deshalb basieren Sie auf Cent. Also wird die 13,25 $ als 1325 in der Datenbank gespeichert. Sie formatieren das Dollarzeichen und die Dezimalstelle in der Ansicht. – sosborn

+1

Außer natürlich berechnen Sie den Preis von etwas, das Bruchteile von einem Cent verwendet, zum Beispiel Gaspreise. Dann sollten Sie zwei Felder haben - eins, um den Bruch als ganze Zahl zu speichern, und ein anderes, um Ihnen zu sagen, wie viele Dezimalstellen die erste Zahl haben sollte und ... oh, das ist idiotisch, verwenden Sie einfach eine Dezimalzahl :) – MikeJ

10

Floats sind nicht korrekt: nur Werte

0.3 - 0.2 - 0.1 
=> -2.77555756156289e-17 

Sie sie nicht, es sei denn Sie verwenden.

Wenn Sie Berechnungen durchführen müssen, speichern Sie den Preis in Cents als Ganzzahl. Sie können sie leicht als USD mit einem Helfer anzeigen.

+2

omg das wirklich das passiert. – jturolla

+2

es ist nur eine Precison-Sache. Es ist nichts falsch mit dem Wert. Das -2,7 * 10^-17 ist sehr nahe bei Null –

Verwandte Themen