Ответ 1
Я помню, как мой профессор CompSci сказал, что никогда не использовать float для валюты.
Причиной этого является то, что спецификация IEEE определяет float в двоичном формате. В основном, он хранит знак, дробь и показатель для представления Float. Это похоже на научную нотацию для двоичного кода (что-то вроде +1.43*10^2
). Из-за этого невозможно точно хранить фракции и десятичные знаки в Float.
Вот почему есть десятичный формат. Если вы это сделаете:
irb:001:0> "%.47f" % (1.0/10)
=> "0.10000000000000000555111512312578270211815834045" # not "0.1"!
тогда как если вы просто сделаете
irb:002:0> (1.0/10).to_s
=> "0.1" # the interprer rounds the number for you
Итак, если вы имеете дело с небольшими фракциями, такими как усугубляющие интересы или даже геолокация, я бы очень рекомендовал формат Decimal, поскольку в десятичном формате 1.0/10
составляет ровно 0,1.
Однако следует отметить, что, несмотря на меньшую точность, поплавки обрабатываются быстрее. Здесь контрольный показатель:
require "benchmark"
require "bigdecimal"
d = BigDecimal.new(3)
f = Float(3)
time_decimal = Benchmark.measure{ (1..10000000).each { |i| d * d } }
time_float = Benchmark.measure{ (1..10000000).each { |i| f * f } }
puts time_decimal
#=> 6.770960 seconds
puts time_float
#=> 0.988070 seconds
Ответ
Используйте float, когда вы не слишком заботитесь о точности. Например, некоторым научным симуляциям и расчетам требуется только до 3 или 4 значащих цифр. Это полезно в торговле с точностью для скорости. Поскольку они не нуждаются в точности так же сильно, как скорость, они будут использовать float.
Используйте десятичный, если вы имеете дело с цифрами, которые должны быть точными и суммироваться с правильным числом (например, усугублять интересы и связанные с деньгами вещи). Помните: если вам нужна точность, вы всегда должны использовать десятичное число.