2016-08-05 16 views
0

Ich weiß nicht, ob es ein Ecto- oder Elixir-Problem ist. Wenn ich eine Nummer in der Datenbank wie 1000, 15000 usw. habe, dann gibt es Ecto als 1.0e3, 1.5e4 ... Wenn ich diese 1000 zu 1234 ändere, ist alles in Ordnung.Ecto liefert Zahlen in wissenschaftlicher (exponentieller) Notation

Elixir 1.3.2, Ecto 2.0.3, MySQL

Migration:

alter table(:incoming_transfers) do 
    add :fee, :float # Ecto translates it as DOUBLE in MySQL 
end 

Schema:

schema "incoming_transfers" do 
    field :fee, :float 
end 

Wenn ich manuell in meiner Datenbank Typ DOUBLE ändern, das Problem FLOAT Überreste. Aber wenn ich es zu INTEGER ändere, ist es gut.

+0

Welchen Typ haben Sie für diese Spalte in der Migration für die Tabelle und die Schemadeklaration im Modell verwendet? Können Sie bitte die relevanten Snippets dieser beiden Dateien in die Frage aufnehmen? – Dogbert

+0

@Dogbert Ich habe meine Frage aktualisiert –

+0

Also - vielleicht ist es eine dumme Frage - warum Sie ganze Zahlen als Floats behalten möchten? Verwenden Sie einfach Integer im Schema. – PatNowak

Antwort

0

Für diejenigen, die die von @Dogbert erwähnte Funktion außer Kraft setzen möchten. Setzen Sie ihn einfach in Ihrem Code:

defimpl Inspect, for: Float do 
    def inspect(term, _opts) do 
    IO.iodata_to_binary(:io_lib_format.fwrite_g(term)) 
    end 
end 

und ändern :io_lib_format.fwrite_g(term) zu so etwas wie :erlang. float_to_binary(term, [decimals: 6]). Zum Beispiel für gibt es "7.120000" zurück.

Wie auch immer, ich denke, es wäre besser, Decimal anstelle von Float zu verwenden.

1

Elixir Inspect Implementierung für Floatjust delegates to :io_lib_format.fwrite_g/1 und :io_lib_format.fwrite_g/1's source in Erlang/OTP erwähnt, dass sie die Zahl genau in der geringsten Anzahl von Zeichen möglich zu drucken versucht. So wird 1000 in 1.0e3 konvertiert, weil das kürzer ist als 1000.0, aber 100.0 wird nicht in 1.0e2 konvertiert, weil das nicht kürzer ist als 100.0. Ähnlich wird 12300.0 in 1.23e4 konvertiert, weil das kürzer ist.

%% Writes the shortest, correctly rounded string that converts 
%% to Float when read back with list_to_float/1. 
%% 
%% See also "Printing Floating-Point Numbers Quickly and Accurately" 
%% in Proceedings of the SIGPLAN '96 Conference on Programming 
%% Language Design and Implementation. 

Erlang:

1> [1000.0, 100.0, 12300.0]. 
[1.0e3,100.0,1.23e4] 

Beachten Sie, dass dies tut nicht Ergebnis in jeder Genauigkeit zu verlieren (das hinaus, was Gleitkommazahlen schon verlieren). 1000.0 ist genau gleich 1.0e3.