2017-09-25 2 views
0

Wie bekomme ich eine Fließkommazahl als String ohne Exponentennotation, also eine Zahl, die in "e-10" oder ähnlichem endet? Ich entdeckte to_s gibt die Zahl mit der Exponentennotation zurück.Wie bekomme ich eine Fließkommazahl als String ohne Exponentennotation?

ms = 1457000.0000000002 % 1000 # => 2.3283064365386963e-10 
ms.to_s      # => "2.3283064365386963e-10" 

würde Ich mag "0.0000000002" bekommen, aber ich es nicht richtig machen.

Wenn ich mein Beispiel oben verwende und "%f" % ms auswerte, bekomme ich "0.000000", was sich sehr von "0.0000000002" unterscheidet.

+0

möglichen Duplikat [Rubins: Controlling Druck in wissenschaftlicher Notation] (https://stackoverflow.com/questions/1189618/ruby-controlling-printing-in -wissenschaftliche Notation) – moveson

+0

Diese Lösung funktioniert nicht für mich, tho. Wenn Sie mein Beispiel oben verwenden und "% f"% ms ausführen, erhalten Sie "0.000000", was sich stark von "0.0000000002" unterscheidet. –

+0

Nun, technisch ist es nicht * sehr * anders, aber es spiegelt vielleicht nicht die Genauigkeit wider, die du willst. –

Antwort

1

Ich denke, es würde immer noch funktionieren, wenn Sie die Anzahl der Dezimalstellen (DP) %f angeben. Nehmen Sie sich beispielsweise zum Beispiel ist der Ausgang ein Exponent von e-10 so genau sein würde, wenn Sie angeben, ist die DP bis 10. Hier ist ein spezifisch:

ms = 1457000.0000000002 
secs, ms = ms.divmod(1000) 
my_answer = '%.10f' % ms 

Ihr Ausgang => "0.0000000002"

+1

Danke. Was passiert, wenn ich die Anzahl der Dezimalstellen nicht im Voraus weiß? –

0

Dies scheint sein wird, eine zu sein Duplikat dieser Ausgabe:

Force Ruby to not output a float in standard form/scientific notation/exponential notation

Sie sprintf verwenden können, die formatierte Zahl drucken:

Es ist wichtig zu beachten, dass Gleitkommazahlen nicht vollkommen präzise sind - also wenn Sie sprintf sagen, um mehr Ziffern angezeigt werden, sagen 16, werden Sie diese Unschärfen sehen:

sprintf("%.16f", ms) 
=> "1457000.0000000002328306" 

Ein Trick für zwingt die Präzision ist to_r zu verwenden, um den Wert zu einem Rational zu konvertieren:

ms = '1457000.0000000002'.to_r 
=> (7285000000000001/5000000000) 
sprintf("%.16f", ms) 
=> "1457000.0000000002000000" 
Verwandte Themen