Поскольку π является иррациональным числом , его десятичное представление никогда не заканчивается и никогда не превращается в постоянно повторяющийся шаблон .
Следовательно, алгоритмы вычисленияиз π можно найти только результаты с указанной точностью.
BigMath.PI
- не исключение.
Параметр prec
который мы передаем в качестве первого аргумента, означает точность (то есть число точных цифр после десятичной точки).
Когда мы выполняем BigMath.PI(9)
, мы получаем BigDecimal
экземпляр, строковое представление которого равно 0.3141592653589793238462643313830947690870926e1
.
Если мы посмотрим более внимательно на эту строку, мы увидим e1
в конце.
Такое обозначение встречается в математике и означает:
Следовательно, в нашем случае
0.3141592653589793238462643313830947690870926e1
совпадает с
0.3141592653589793238462643313830947690870926 * 10 = 3.141592653589793238462643313830947690870926
Поскольку мы передали 9
в BigMath.PI
у нас есть по крайней мере 9 точных цифр после десятичной точки
3.141592653589793238462643313830947690870926
3.141592653_________________________________
(На самом деле, когда мы передаем 9
в BigMath.PI
, он возвращает более 9 точных цифр после десятичной точки, но мы не должны полагаться на этот факт. Вы можете попытаться сравнить , если хотите).
И, вероятно, последнее, что следует упомянуть: мы не можем просто преобразовать BigDecimal
в Float
, если мы заботимся о точности,потому что Float
обычно хранит только 15 цифр после десятичной точки.
Итак, если ваша цель - показать π с произвольным числом цифр после десятичной точки, вы можете использовать следующий метод:
require 'bigdecimal/math'
##
# Returns PI as a string with number_of_digits_after_decimal_dot.
#
def pi(number_of_digits_after_decimal_dot: 2)
# Let's assume presicion equals to 2 as an example
precision = number_of_digits_after_decimal_dot
result = BigMath.PI(precision)
# => ВigDecimal 0.31415926535897932384671233672993238432e1
result = result.truncate(precision).to_s
# => String 0.314e1
# Remove '0.'
result = result[2..-1]
# => String 3141e1
# Remove 'e1'
result = result.split('e').first
# => String 3141
result = result.insert(1, '.')
# => String 3.141
result
end
(спецификации можно найти здесь ).
Если нет, то, пожалуйста, обновите свой вопрос, чтобы сделать его менее двусмысленным.