2012-01-10 11 views
5

W jaki sposób wymusić wyświetlanie float ze wszystkimi znaczącymi miejscami/pełną precyzją bez notacji naukowej w języku Ruby?Jak zmusić Float do wyświetlania z pełną precyzją bez notacji naukowej, a nie jako ciąg?

Obecnie konwertuję BigDecimal na Float, BigDecimal(0.000000001453).to_f, jednak daje to wypadkową wartość 1,453e-09. Jeśli zrobię coś takiego, jak "%14.12f" % BigDecimal("0.000000001453").to_f, otrzymam ciąg znaków. W tym przypadku jednak ciąg znaków jako wynik jest niedopuszczalny, ponieważ potrzebuję go jako rzeczywistej wartości liczbowej bez notacji naukowej.

--- Edit ---

Dobrze, podam tu pewien kontekst, który prawdopodobnie będzie wymagać zmiany mojego pierwotnego pytania.

Próbuję utworzyć wykres z Highstock & lazy_high_chart. Wcześniej dzisiaj udało mi się narysować wykresy dokładnie wtedy, gdy pływaki emitowały do ​​wynikowego js jako pełne precyzję pływaka, a pojawiały się w notacji naukowej. Dlatego czułem, że problem tkwi w tym problemie.

Ale po kilku wejściach, które tu dostaję, być może potrzebuję dalszej analizy źródła i moje założenie jest niewłaściwie umieszczone. Pozwolę ci zdecydować:

@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

Co chcesz z tym zrobić? Wygląda na to, że oba formaty są już potrzebne: notacja "1.453e-09" służy tylko do wyświetlania, wewnętrznie jest zapisywana jako numeryczna wartość zmiennoprzecinkowa, dzięki czemu można z nią korzystać w tej formie. Jeśli chcesz go wyświetlić, ciąg znaków, który otrzymasz z operacji formatowania '"% 14.12f "powinien działać poprawnie. – ctcherry

+0

Kiedy wysyłam to (w tym przypadku z lazy_high_charts) kończę notacją naukową w wynikowym jsonie. Ze wszystkiego, co widziałem i wypróbowałem poprzednio, wynik musi być liczbą zmiennoprzecinkową lub całkowitą. Szczerze mówiąc, wcześniej miałem pływaki wychodzące bez notacji naukowej i od tamtej pory zmieniło się coś w mojej logice podczas pracy z datetime znaczkami, a teraz wraca do wysyłania notacji naukowej, która nie jest pokazana na wykresie. W tym momencie jedyną rzeczą, którą widzę, że jest różnicą jest ten problem formatowania na poziomie wyjściowym js. – ylluminate

+0

JavaScript rozumie notację naukową: http://jsfiddle.net/SJFTe/ czy możesz zostawić to w swoich wynikach? – ctcherry

Odpowiedz

4

Reprezentacja łańcuchów i rzeczywista wartość zmiennoprzecinkowa to dwie różne rzeczy.

To, co widzisz na ekranie/wydruk jest zawsze reprezentacją ciągów, czy to w notacji naukowej, czy w "normalnym" zapisie. Pętla jest konwertowana na jej reprezentację ciągów przez to_s, puts, "%.10f" % i inne.

Wartość sama w sobie jest niezależna. Więc twoje ostatnie zdanie nie ma większego sensu. Wynik jest zawsze ciągiem.

Aby wymusić określony format zmiennoprzecinkowy w Rails'ach to_json, można nadpisać Float#encode_json, np.

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

Umieść to przed swoim kodem powyżej. Zauważ, że - w zależności od twoich rzeczywistych wartości - możesz potrzebować bardziej wyrafinowanej logiki, aby wytworzyć rozsądne łańcuchy.

+1

Prawo i to było celem mojego ostatniego oświadczenia, próbuję przymusić float, by wyemitował jako pełną precyzję float do wyniku json/js i występując jako numer zapisu naukowego. Możesz odwołać się do mojego komentarza do @ctcherry powyżej. – ylluminate

+0

Następnie pokaż, jak produkujesz dane wyjściowe json. –

+0

Proszę, zredagowałem pytanie z kodem, aby podać kontekst ... prawdopodobnie zmieniło się charakter pytania, ale przynajmniej można teraz zrozumieć duży obraz. – ylluminate

4

Czy to praca dla Ciebie -

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

Zgodnie z moją wcześniejszą uwagą w początkowym komunikacie, miałem na celu uzyskanie wyjściowego luzu w stosunku do łańcucha; które można zmienić za pomocą to_f, ale nadal widzę to w notacji naukowej. Posunąłem się naprzód i przedstawiłem pełny kod sekcji, aby dać ci teraz pewien kontekst. Chociaż prawdopodobnie zmieniło to charakter początkowego pytania, sądzę, że lepiej jest podać pełną migawkę do tego, co się dzieje. – ylluminate

Powiązane problemy