Как заставить Float отображать с полной точностью без научной записи, а не как строку? - PullRequest
6 голосов
/ 10 января 2012

Как заставить отображать поплавок со всеми значимыми точками / полной точностью без научной записи в Ruby?

В настоящее время я конвертирую BigDecimal в Float, BigDecimal(0.000000001453).to_f, однако это дает результирующее плавание 1.453e-09. Если я сделаю что-то вроде "%14.12f" % BigDecimal("0.000000001453").to_f, я получу строку. В этом случае, однако, строка в качестве вывода недопустима, так как она мне нужна как фактическое числовое значение с плавающей точкой без научной записи.

--- Редактировать ---

Хорошо, позвольте мне привести здесь некоторый контекст, который, вероятно, потребует изменения моего первоначального вопроса.

Я пытаюсь создать график с помощью Highstock & lazy_high_chart. Ранее сегодня мне удавалось прекрасно рисовать графики, когда поплавки излучали в результирующий js как поплавки с полной точностью по сравнению с отображением в научной записи. Поэтому я чувствовал, что проблема заключается в этом вопросе.

Но после нескольких входных данных, которые я здесь получаю, возможно, мне нужен дополнительный обзор источника, и мое предположение неуместно. Я позволю вам решить:

@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

Ответы [ 2 ]

4 голосов
/ 10 января 2012

Будет ли это работать для вас -

>> 0.000000001453
=> 1.453e-09 # what you are getting right now
>> puts "%1.12f" % 0.000000001453
0.000000001453 # what you need
=> nil
4 голосов
/ 10 января 2012

Строковое представление и фактическое значение с плавающей точкой - это две разные вещи.

То, что вы видите на экране / распечатке, всегда является строковым представлением, будь то в научной или «нормальной» записи.Число с плавающей запятой преобразуется в строковое представление с помощью to_s, puts, "%.10f" % и других.

Само значение с плавающей запятой не зависит от этого.Так что ваше последнее предложение не имеет особого смысла.Выводом всегда является строка.

Для принудительного использования определенного формата с плавающей точкой в ​​Rails 'to_json вы можете перезаписать Float#encode_json, например,

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

Поставьте это перед кодом выше.Обратите внимание, что - в зависимости от ваших фактических значений - вам может потребоваться более сложная логика для создания разумных строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...