Я обычно думаю о натуральных против искусственных количествах.
Естественные количества - это такие вещи, как вес, рост и время. Они никогда не будут измерены абсолютно точно, и редко есть какая-либо идея абсолютно точной арифметики: вы не должны, как правило, прибавлять высоты, а затем проверять, что результат в точности соответствует ожидаемому. Используйте double
для такого количества. Двойники имеют огромный диапазон, но ограниченную точность; они также очень быстрые.
Доминирующее искусственное количество - деньги. Существует такая вещь, как «ровно 10,52 доллара», и если вы добавите к ней 48 центов, вы ожидаете, что получите ровно 11 долларов. Используйте decimal
для такого количества. Обоснование: учитывая, что для начала это искусственно, задействованные числа тоже искусственные, рассчитанные на удовлетворение потребностей человека, что означает, что они естественным образом выражены в базе 10. Сделайте так, чтобы представление хранилища соответствовало представлению человека. У decimal
нет диапазона double
, но большинству искусственных величин этот дополнительный диапазон тоже не нужен. Это также медленнее, чем double
, но у меня лично был банковский счет, который давал бы мне правильный ответ медленнее, чем неправильный ответ:)
Для получения дополнительной информации у меня есть статьи о .NET двоичных типах с плавающей запятой и десятичном типе .NET . (Обратите внимание, что decimal
также является типом с плавающей запятой, но рассматриваемая «точка» - это десятичная точка, а не двоичная точка.)