Тип данных float или Тип данных decimal должны использоваться для сумм в долларах?
ответ легок. Никогда плавания. НИКОГДА !
Плавания были согласно [1 110] IEEE 754 всегда двоичный файл, только новый стандарт , IEEE 754R определил десятичные форматы. Многие дробные двоичные части никогда не могут равняться точному десятичному представлению.
Любое двоичное число может быть записано какm/2^n
(m
,n
положительные целые числа), любое десятичное число какm/(2^n*5^n)
.
, Поскольку двоичные файлы испытывают недостаток в началеfactor 5
, все двоичные числа могут быть точно представлены десятичными числами, но не наоборот.0.3 = 3/(2^1 * 5^1) = 0.3 0.3 = [0.25/0.5] [0.25/0.375] [0.25/3.125] [0.2825/3.125] 1/4 1/8 1/16 1/32
, Таким образом, Вы заканчиваете с числом или выше или ниже, чем данное десятичное число. Всегда.
, Почему это имеет значение? Округление.
Нормальное округление означает 0.. 4 вниз, 5.. 9. Таким образом, это делает вопрос, если результат или0.049999999999
.... или0.0500000000
... Можно знать, что это означает 5 центов, но компьютер не знает что и раунды0.4999
... вниз (неправильно) и0.5000
... (справа).
, Учитывая, что результат вычислений с плавающей точкой всегда содержат маленькие остаточные члены, решение является чистой удачей. Это становится безнадежным, если Вы хотите десятичную обработку раунда-к-ровному с двоичными числами.Неубежденный? Вы настаиваете, что в Вашей системе учетной записи все совершенно в порядке?
равные Активы и пассивы? Хорошо, затем возьмите каждое из данных отформатированных чисел каждой записи, проанализируйте их и суммируйте их с независимой десятичной системой счисления! Сравните это с отформатированной суммой.
ой, существует что-то не так, не так ли?Для того вычисления, экстремальной точности и точности требовался (мы использовали ПЛАВАНИЕ Oracle), таким образом, мы могли записать "миллиардную часть пенса", являющегося accured.
не помогает против этой ошибки. Поскольку все люди автоматически предполагают, что компьютерное право сумм, практически никто не проверяет независимо.
Есть некоторые проблемы с двумерными массивами
, как вы их реализуете.
a= [[1,2],[3,4]]
a[0][2]= 5 # works
a[2][0]= 6 # error
Хеш
как массив
Я предпочитаю использовать Хэши
для многомерных массивов
a= Hash.new
a[[1,2]]= 23
a[[5,6]]= 42
Это имеет то преимущество, что вам не нужно вручную создавать столбцы или строки. Вставка в хеши занимает почти O (1) , поэтому здесь нет недостатка, если ваш хэш
не становится слишком большим.
Вы даже можете установить значение по умолчанию для всех неуказанных элементов
a= Hash.new(0)
Итак, теперь о том, как получить подмассивы
(3..5).to_a.product([2]).collect { |index| a[index] }
[2].product((3..5).to_a).collect { |index| a[index] }
(a..b) .to_a
выполняется за O (n). Получение элемента из хэша
составляет почти O (1), поэтому сбор выполняется почти за O (n). Нет способа сделать это быстрее, чем O (n), так как копирование n элементов всегда выполняется за O (n).
Хэши
могут иметь проблемы, когда становятся слишком большими. Так что я бы дважды подумал о реализации многомерного массива
, подобного этому, если бы я знал, что объем моих данных становится большим.
rows, cols = x,y # your values
grid = Array.new(rows) { Array.new(cols) }
Что касается доступа к элементам, эта статья очень хороша для пошагового способа инкапсуляции массива так, как вы хотите:
Вы не указали свою фактическую цель, но, возможно, это может помочь:
require 'matrix' # bundled with Ruby
m = Matrix[
[1, 2, 3],
[4, 5, 6]
]
m.column(0) # ==> Vector[1, 4]
(и Vectors действует как массивы)
или, используя аналогичная нотация по вашему желанию:
m.minor(0..1, 2..2) # => Matrix[[3], [6]]
x.transpose [6] [3..8]
или x [3..8] .map {| r | r [6]}
даст то, что вы хотите.
Пример:
a = [ [1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[21, 22, 23, 24, 25]
]
#a[1..2][2] -> [8,13]
puts a.transpose[2][1..2].inspect # [8,13]
puts a[1..2].map {|r| r[2]}.inspect # [8,13]
Вот пример 3D массива
class Array3D
def initialize(d1,d2,d3)
@data = Array.new(d1) { Array.new(d2) { Array.new(d3) } }
end
def [](x, y, z)
@data[x][y][z]
end
def []=(x, y, z, value)
@data[x][y][z] = value
end
end
Вы можете получить доступ к подразделам каждого массива так же, как и к любому другому массиву Ruby. @data[0..2][3..5][8..10] = 0 etc