Я хочу маніпулювати дуже довгим числом за допомогою Рубі. Але коли я друкую номер на екрані, я отримую лише кілька цифр від початкового числа. Тож як я можу отримати всі потрібні цифри?
Ось мій код
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