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
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
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
JavaScript rozumie notację naukową: http://jsfiddle.net/SJFTe/ czy możesz zostawić to w swoich wynikach? – ctcherry