Обработка массивных (высокоточных) поплавков в Ruby - PullRequest
1 голос
/ 12 августа 2010

Я делаю приложение, которое прослушивает цены, которые регулярно обновляются, но иногда мой источник данных выдает мне что-то вроде "1.79769313486232e + 308". Числа, которые отправляются, никогда не будут действительно большими числами (например, "179769313486232e + 308"), но, как и в примере выше, они идут с большой точностью.

Я был бы рад отбросить все после первой пары десятичных знаков и получить что-то вроде «1.798», но следующий код не работает для меня:

irb(main):001:0> s = '1.79769313486232e+308'
=> "1.79769313486232e+308"
irb(main):002:0> ("%.3f" % s).to_f
(irb):2: warning: Float 1.79769313486232e+30... out of range
=> 0.0

Какие-нибудь изящные способы обработки таких чисел в Ruby?

Ответы [ 3 ]

10 голосов
/ 12 августа 2010

Вы должны узнать из своего источника данных, что означают эти действительно большие цифры.Цена на самом деле не 1.797e + 308, но, вероятно, также не 1.797.То, как вы справляетесь с этими числами, полностью зависит от того, какое значение вы должны интерпретировать как.

Обновление: я не уверен, что вы понимаете, что означает это число.1.79769313486232e + 308 - это 1.79769313486232, умноженное на десять к 308-й степени.Это число с более чем 300 цифрами слева от десятичной точки.Это не цена, это ошибка.Это верхний предел того, что может представлять плавающая точка двойной точности.

Другими словами, вы получаете эквивалент 0xFFFFFFFF или что-то в этом роде, но интерпретируется как число с плавающей запятой.

3 голосов
/ 12 августа 2010

Это прямо в верхней части диапазона «двойников». Например, в Python он конвертируется в специальный float с именем "inf".

Изящным способом справиться с этим может быть обращение с ним как с бесконечностью

0 голосов
/ 12 августа 2010

Вы можете удалить лишние десятичные дроби, используя регулярное выражение

 >> s =~ /\.\d\d\d(\d+)/
 >> s.gsub($1, '')
 => "1.797e+308"
...