/ / Як я можу отримати всі цифри дубля в Ruby? [закритий] - рубін, плаваюча точка, подвійний

Як отримати всі цифри подвійного в Ruby? [закрито] - рубій, плаваюча точка, подвійна

Я хочу маніпулювати дуже довгим числом за допомогою Рубі. Але коли я друкую номер на екрані, я отримую лише кілька цифр від початкового числа. Тож як я можу отримати всі потрібні цифри?

Ось мій код

x = Array.new
y = Float(0)
for i in (0..100)
x[i] = 14*2**i
y += x[i]/100**i
end

puts y
#=> 14.2857142857143

Відповіді:

2 для відповіді № 1

Отриманий результат - просто візуальне зображення плаваючого числа. Однак усередині комп'ютерів використовується формат (двійкова плаваюча точка), який не може точно представляти число, як 0,1, 0,2 або 0,3.

Незалежно від того, який код ми можемо вам надати, але якщо aчисло має нескінченне подання, кожна спроба відформатувати або відобразити його в десятковому зображенні в кінцевому підсумку закінчується промальовкою. Це може бути 10 цифр, 1000 чи навіть 100000000 цифр, але це завжди роуд.

Справа з десятковою комою важко. Залежно від того, що ви намагаєтеся досягти, ви можете:

  • розглянути можливість використання BigDecimal (BigDecimal надає подібну підтримку дуже великих або дуже точних чисел з плаваючою точкою) або
  • у разі маніпуляцій з грошима ви можете представляти значення у вигляді Цілих чисел та маніпулювати цілими числами. Розділіть ціле число на кількість центів лише з метою форматування

Ось приклад використання BigDecimal

require "bigdecimal"

x = []
y = BigDecimal(0)
for i in (0..100)
x[i] = 14*2**i
y += x[i]/100**i
end

puts y
# => 0.14E2

puts y.to_i
# => 14

puts y.to_f
# => 14.0

0 для відповіді № 2

Ось як би це зробити, вимагаючи стандартної бібліотеки mathn :

require "mathn"

x = Array.new
y = Float(0)
for i in (0..100)
x[i] = 14*2**i
y += x[i]/100**i
end
y  # => 14.285714285714285
y.round(7) # => 14.2857143
y.round(9) # => 14.285714286
y.round(13) # => 14.2857142857143