Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
class Float EPSILON = 1e-6 def equals?(x, tolerance=EPSILON) (self-x).abs < tolerance endendflag1 = (3.1416).equals? Math::PI # falseflag2 = (3.1416).equals?(Math::PI, 0.001) # trueМожно также ввести совершенно новый оператор для приближенного сравнения, назвав его, например,
=~Имейте в виду, что это нельзя назвать настоящим решением. При последовательных вычислениях погрешность накапливается. Если вам совершенно необходимы числа с плавающей точкой, смиритесь с неточностями (см. также разделы 5.8 и 5.9).
5.5. Форматирование чисел для вывода
Для вывода числа в заданном формате применяется метод
printfprintfx = 345.6789i = 123printf("x = %6.2fn", x) # x = 345.68printf("x = %9.2en", x) # x = 3.457e+02printf("i = %5dn i) # i = 123printf("i = %05dn", i) # i = 00123printf("i = %-5dn, i) # i = 123Чтобы сохранить результат в строке, а не печатать его немедленно, воспользуйтесь методом
sprintfstr = sprintf ("%5.1f",x) # "345.7"Наконец, в классе
String%%# Порядок вызова: 'формат % значение'str = "%5.1f" % x # "345.7"str = "%6.2f, %05d" % [x,i] # "345.68, 00123"5.6. Вставка разделителей при форматировании чисел
Возможно, есть и более удачные способы достичь цели, но приведенный ниже код работает. Мы инвертируем строку, чтобы было удобнее выполнять глобальную замену, а в конце инвертируем ее еще раз:
def commas(x)str = x.to_s.reversestr.gsub!(/([0-9]{3})/,"\1,")str.gsub(/,$/,"").reverseendputs commas(123) # "123"puts commas(1234) # "1,234"puts commas(12345) # "12,435"puts commas(123456) # "123,456"puts commas(1234567) # "1,234,567"5.7. Работа с очень большими числами
Управлять массами все равно что управлять немногими: дело в частях и в числе.
При необходимости Ruby позволяет работать с произвольно большими целыми числами. Переход от
FixnumBignumFixnumBignumnum1 = 1000000 # Один миллион (10**6)num2 = num1*num1 # Один триллион (10**12)puts num1 # 1000000puts num1.class # Fixnumputs num2 # 1000000000000puts num2.class # BignumРазмер
FixnumBignum5.8. Использование класса BigDecimal
Стандартная библиотека
bigdecimalЧтобы оценить преимущества, рассмотрим следующий простой фрагмент кода, в котором используются числа с плавающей точкой:
if (3.2 - 2.0) == 1.2 puts "равны"else puts "не равны" # Печатается "не равны"!endВ подобной ситуации на помощь приходит класс
BigDecimalОбъект
BigDecimalFloatBigDecimalBigDecimalBigDecimal.new+*to_srequire 'bigdecimal'x = BigDecimal("3.2")y = BigDecimal("2.0")
