2012-01-10 7 views
5

Come si forza a mostrare un galleggiante con tutti i punti significativi/la massima precisione senza notazione scientifica in Ruby?Come forzare la visualizzazione di un Float con precisione assoluta senza notazione scientifica e non come stringa?

Attualmente converto un BigDecimal in Float, BigDecimal(0.000000001453).to_f, tuttavia questo produce un galleggiamento risultante di 1.453e-09. Se faccio qualcosa come "%14.12f" % BigDecimal("0.000000001453").to_f ottengo una stringa. In questo caso, tuttavia, una stringa come output non è accettabile in quanto ho bisogno di un valore numerico effettivo senza notazione scientifica.

--- --- Modifica

Va bene, lasciatemi fare un po 'di contesto qui, che probabilmente richiederà un cambiamento della mia domanda iniziale.

Sto tentando di creare un grafico con Highstock & lazy_high_chart. Oggi sono riuscito a disegnare i grafici bene quando i float emettevano il j risultante mentre galleggiava a piena precisione contro la notazione scientifica. Quindi ho sentito che il problema risiede in questo problema.

Ma dopo i pochi input che sto ottenendo qui, forse ho bisogno di un ulteriore esame della fonte e la mia ipotesi è malriposta. Ti permetterò di decidere:

@h = LazyHighCharts::HighChart.new('graph') do |f| 
    hours_of_readings = 1 
    reading_intervals = 1 #hour 
    readings_per_hour = 60 

    readings = ModelName.order("date DESC").select('data_readings.data2, data_readings.data1, data_readings.date').limit(hours_of_readings * readings_per_hour).all 

    data1_and_date_series = Array.new 
    data2_and_date_series = Array.new 
    dates = Array.new 

    # I have been thinking that the problem lies here in the "row.data1.to_f" and 
    # "row.data2.to_f" and thus this is the root of my initial question in terms 
    # of it emitting scientific notation to the js output in the format of: 
    # [[1.0e-09], [1.04e-09],[9.4e-09], ... [3.68e-09]] 
    data1_and_date_series = readings.map{|row| [(row.date.to_i * 1000), (row.data1.to_f if BigDecimal(row.data1) != BigDecimal("-1000.0"))] } 
    data2_and_date_series = readings.map{|row| [(row.date.to_i * 1000), (row.data2.to_f if BigDecimal(row.data2) != BigDecimal("-1000.0"))] } 


    f.series(
     :name => 'Data1', 
     :data => data1_and_date_series, 
     :pointStart => Time.now.to_i * 1000, 
     :pointEnd => hours_of_readings.hours.ago.to_i * 1000, 
     :pointInterval => reading_intervals.hour * 1000, 
     :color => 'blue' 
) 
    f.series(
     :name => 'Data2)', 
     :data => data2_and_date_series, 
     :pointStart => Time.now.to_i * 1000, 
     :pointEnd => hours_of_readings.hours.ago.to_i * 1000, 
     :pointInterval => reading_intervals.hour.to_i * 1000, 
     :color => 'red' 
) 

    f.chart({:defaultSeriesType=>"spline" }) 
    f.yAxis [ 
     {:title => { :text => "Label 1", :margin => 10} }, 
     {:title => { :text => "Label 2 (groups)"}, :opposite => true}, 
     {:max => 0}, 
     {:min => -0.000000001} 
    ] 
    f.options[:xAxis] = { 
     :title => { :text => "Time"}, 
     :type => "datetime" 
    } 
    f.title(:text => "Title") 
    f.legend(:align => 'right', :verticalAlign => 'top', :y => 75, :x => -50, :layout => 'vertical') # override the default values 
end 
+1

Cosa stai cercando di fare con esso? Sembra che abbiate entrambi i formati che avete già bisogno: la notazione '1.453e-09' è solo per la visualizzazione, internamente è memorizzata come un valore numerico float, quindi potete fare matematica con quella forma. Se lo si visualizza, la stringa ottenuta dall'operazione di formattazione '"% 14.12f "' dovrebbe funzionare correttamente. – ctcherry

+0

Quando emetto questo (in questo caso con lazy_high_charts), finisco con la notazione scientifica all'interno del json risultante. Da tutto ciò che ho visto e provato in precedenza, il risultato deve essere un float o intero. Sinceramente oggi ho fatto uscire i galleggianti senza notazione scientifica e da allora a oggi qualcosa è cambiato nella mia logica mentre lavoravo con i timbri datetime e ora è tornato ad emettere una notazione scientifica che non è mostrata nel grafico. A questo punto l'unica cosa che posso vedere è che questo è un problema di formattazione al livello di uscita di js. – ylluminate

+0

Javascript comprende la notazione scientifica: http://jsfiddle.net/SJFTe/ puoi lasciarlo nella tua produzione? – ctcherry

risposta

4

La rappresentazione di stringa e il valore effettivo di un float sono due cose diverse.

Quello che vedi sullo schermo/stampa è sempre una rappresentazione di stringa, che si tratti di notazione scientifica o notazione "normale". Un float viene convertito nella sua rappresentazione di stringa tramite to_s, puts, "%.10f" % e altri.

Il valore float è indipendente da quello. Quindi la tua ultima frase non ha molto senso. L'output è sempre una stringa.

Per applicare un determinato formato float in Rails 'to_json è possibile sovrascrivere Float#encode_json, ad es.

class ::Float 
    def encode_json(opts = nil) 
    "%.10f" % self 
    end 
end 

Metti questo prima del codice sopra. Nota che, a seconda dei tuoi valori effettivi, potresti aver bisogno di una logica più sofisticata per produrre stringhe ragionevoli.

+1

Giusto e questo era lo scopo della mia ultima affermazione, sto provando a forzare il float ad emettere come un float di precisione completo su un risultato json/js che appare come un numero di notazione scientifica. Puoi fare riferimento al mio commento a @ctcherry sopra. – ylluminate

+0

Quindi, si prega di mostrare come si sta producendo l'uscita JSON. –

+0

Ecco, hai modificato la domanda con il codice per darti il ​​contesto ... probabilmente hai cambiato la natura della domanda, ma almeno ora puoi capire il quadro generale. – ylluminate

4

Sarà questo lavoro per voi -

>> 0.000000001453 
=> 1.453e-09 # what you are getting right now 
>> puts "%1.12f" % 0.000000001453 
0.000000001453 # what you need 
=> nil 
+1

Come nella mia osservazione precedente nel messaggio iniziale, stavo puntando a ottenere un output float vs stringa; che può essere cambiato con un to_f, ma lo vedo ancora in notazione scientifica. Sono andato avanti e ho fornito il codice completo della sezione per darti un po 'di contesto adesso. Anche se probabilmente ha cambiato la natura della domanda iniziale, immagino sia meglio darti un'istantanea completa su cosa sta succedendo. – ylluminate

Problemi correlati