Использовать плавание или десятичное число для суммы в долларах приложения учета?

76
задан Nakilon 17 October 2012 в 02:27
поделиться

21 ответ

Тип данных 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.

не помогает против этой ошибки. Поскольку все люди автоматически предполагают, что компьютерное право сумм, практически никто не проверяет независимо.

109
ответ дан Jimi 24 November 2019 в 11:06
поделиться

Числа с плавающей точкой могут [только 110] представлять числа, которые являются суммой отрицательных кратных чисел основы - для двоичной плавающей точки, конечно, этому два года.

существует только четыре десятичных дроби, представимые точно в двоичной плавающей точке: 0, 0.25, 0.5 и 0.75. Все остальное - приближение, таким же образом это 0.3333... является приближением для 1/3 в десятичной системе исчисления.

Плавающая точка является хорошим выбором для вычислений, где масштаб результата - то, что важно. Это - плохой выбор, где Вы пытаетесь быть с точностью до некоторого количества десятичных разрядов.

0
ответ дан Mike Dimmick 24 November 2019 в 11:06
поделиться

Всегда используйте Десятичное число. Плавание даст Вам неточные значения из-за округления проблем.

0
ответ дан 24 November 2019 в 11:06
поделиться

Ваши бухгалтеры захотят управлять как Вы вокруг. Используя средства плавающие, которые Вы будете постоянно округлять, обычно с ФОРМАТОМ () оператор типа, который не является способом, которым Вы хотите сделать это (используют пол / перекрывающий вместо этого).

у Вас есть типы данных валюты (деньги, smallmoney), который должен использоваться вместо плавания или реальный. Хранение десятичного числа (12,2) устранит Ваши округления, но также устранит их во время промежуточных шагов - который действительно не является тем, что Вы захотите вообще в финансовом приложении.

0
ответ дан David T. Macknet 24 November 2019 в 11:06
поделиться

Вы, вероятно, захотите использовать некоторую форму представления фиксированной точки для значений валюты. Вы также захотите исследовать округление банкира (также известный как "круглая половина даже".) Это избегает предвзятости, которые существуют в обычной "круглой половине" метод.

1
ответ дан user6931 24 November 2019 в 11:06
поделиться

Независимо от того, что Вы делаете, необходимо остерегаться погрешностей округления. Вычислите использование большей степени точности, чем Вы отображаетесь в.

1
ответ дан 1800 INFORMATION 24 November 2019 в 11:06
поделиться

Вы рассмотрели использование типа данных money для хранения сумм в долларах?

Относительно Довода "против", что десятичное число поднимает еще один байт, я сказал бы, не заботятся об этом. В 1 миллионе строк Вы будете только использовать еще 1 МБ, и устройство хранения данных является очень дешевым в эти дни.

1
ответ дан Espo 24 November 2019 в 11:06
поделиться

Я использовал денежный тип SQL для хранения денежной стоимости. Недавно, я должен был работать со многими системами онлайн-платежей и заметил, что некоторые из них используют целые числа для хранения денежной стоимости. В моих текущих и новых проектах я начал использовать целые числа, и я довольно доволен этим решением.

2
ответ дан George 24 November 2019 в 11:06
поделиться

Другая вещь, о которой необходимо знать в системах учета, состоит в том, что ни у кого не должно быть прямого доступа к таблицам. Это означает, что весь доступ к системе учета должен быть через сохраненный procs. Это, предотвращают мошенничество не только нападения Внедрения SQL. У внутреннего пользователя, который хочет совершить мошенничество, не должно быть способности непосредственно изменить данные в таблицах базы данных, когда-либо. Это - critcal внутренний контроль в Вашей системе. Вы действительно хотите, чтобы некоторый раздраженный сотрудник перешел к бэкенду Вашей базы данных и имел его, запускают wrting их проверки? Или скройте это, они утвердили расход лишенному полномочий поставщику, когда у них нет полномочий утверждения? Только два человека в Вашей целой организации должны смочь непосредственно получить доступ к данным в Вашей финансовой базе данных, Вашем dba и его резервном копировании. Если у Вас есть много dbas, у только двух из них должен быть этот доступ.

я упоминаю это, потому что, если Ваши программисты использовали плавание в системе учета, вероятно, они абсолютно незнакомы с идеей внутреннего контроля и не рассматривали их в своей работе по программированию.

3
ответ дан Mitch Wheat 24 November 2019 в 11:06
поделиться

Еще лучше, чем использование десятичных чисел использует просто старые целые числа (или возможно некоторый bigint). Таким образом, у Вас всегда есть самая высокая возможная точность, но точность может быть определена. Например, номер 100 мог означать 1.00, который отформатирован как это:

int cents = num % 100;
int dollars = (num - cents) / 100;
printf("%d.%02d", dollars, cents);

, Если Вам нравится иметь больше точности, можно изменить 100 на большее значение, как: 10 ^ n, где n является количеством десятичных чисел.

3
ответ дан Peter Stuifzand 24 November 2019 в 11:06
поделиться

Можно всегда писать, что что-то как Деньги вводит для.Net.

Смотрят на эту статью: Денежный тип А для CLR - автор сделал превосходную работу, по-моему.

2
ответ дан Tomer Pintel 24 November 2019 в 11:06
поделиться

Единственная причина использовать Плавание за деньги состоит в том, если Вы не заботитесь о точных ответах.

4
ответ дан David Singer 24 November 2019 в 11:06
поделиться

Плавания не являются точными представлениями, проблемы точности возможны, например, при добавлении очень больших и очень маленьких значений. Вот почему десятичные типы рекомендуются за валюту, даже при том, что проблема точности может быть достаточно редкой.

Для разъяснения десятичные 12,2 типов сохранят те 14 цифр точно, тогда как плавание не будет как они использовать двоичное представление внутренне. Например, 0.01 не может быть представлен точно числом с плавающей точкой - самое близкое представление на самом деле 0.0099999998

4
ответ дан Niall 24 November 2019 в 11:06
поделиться

То, что я рекомендовал бы, использует целые числа на 64 бита, которые хранят все это в центах.

5
ответ дан Joshua 24 November 2019 в 11:06
поделиться

Немного фона здесь....

Никакая система счисления не может обработать все вещественные числа точно. У всех есть их ограничения, и это включает обоих стандартная плавающая точка IEEE и подписанное десятичное число. Плавающая точка IEEE более точна на используемый бит, но это не имеет значения здесь.

Финансовые числа основаны на веках практики бумаги-и-пера со связанными конвенциями. Они довольно точны, но что еще более важно, они восстанавливаемы. Два бухгалтера, работающие с различными числами и уровнями, должны придумать то же число. Любая комната для несоответствия является комнатой для мошенничества.

Поэтому для финансовых вычислений, правильный ответ - то, что дает тот же ответ как CPA, кто способен к арифметике. Это - десятичная система счисления, не плавающая точка IEEE.

5
ответ дан David Thornley 24 November 2019 в 11:06
поделиться

Используйте десятичное число SQL-сервера тип.

не используют деньги или плавание .

деньги используют 4 десятичных разряда, быстрее, чем использование десятичного числа , НО страдает от некоторых очевидных, и некоторые не так очевидные проблемы с округлением ( посмотрите этот выпуск подключения)

5
ответ дан Mitch Wheat 24 November 2019 в 11:06
поделиться

Плавающие точки имеют неожиданные иррациональные числа.

, Например, Вы не можете сохранить 1/3 как десятичное число, это было бы 0.3333333333... (и так далее)

, Плавания на самом деле хранятся как двоичное значение и питание 2 экспонент.

Так 1.5 хранится, поскольку 3 x 2 к-1 (или 3/2)

Используя эти показатели основания 2 создают некоторые нечетные иррациональные числа, например:

Преобразовывают 1.1 в плавание и затем преобразовывают его назад снова, Ваш результат будет чем-то как: 1.0999999999989

Это вызвано тем, что двоичное представление 1,1 является на самом деле 154811237190861 x 2^-47, больше, чем двойное может обработать.

[еще 119] об этой проблеме о мой блог , но в основном, для устройства хранения данных, Вы более обеспечены с десятичными числами.

На Microsoft SQL server Вы имеете money тип данных - это является обычно лучшим для финансового устройства хранения данных. Это с точностью до 4 десятичных разрядов.

Для вычислений у Вас есть больше проблемы - погрешность является крошечной частью, но поместила ее в функцию питания, и это быстро становится значительным.

Однако десятичные числа не очень хороши ни для какого вида математики - нет никакой собственной поддержки десятичных полномочий, например.

6
ответ дан Keith 24 November 2019 в 11:06
поделиться

Так же, как дополнительное предупреждение SQL Server и.Net платформа используют различный алгоритм по умолчанию для округления. Удостоверьтесь, что Вы проверяете параметр MidPointRounding в Математике. Вокруг (). платформа.Net использует алгоритм банкиров использованием и SQL Server по умолчанию Симметричное Алгоритмическое Округление. Проверьте статью Wikipedia здесь

10
ответ дан Darrel Miller 24 November 2019 в 11:06
поделиться

Спросите своих бухгалтеров! Они осудят Вас для использования плавания. Как кто-то отправленный прежде, используйте плавание, ТОЛЬКО ЕСЛИ Вы не заботитесь о точности. Хотя я всегда был бы против него когда дело доходит до денег.

В бухгалтерском программном обеспечении не приемлемо плавание. Используйте десятичное число с 4 десятичными точками.

7
ответ дан 24 November 2019 в 11:06
поделиться

Сначала необходимо считать это , Что Каждый Программист Должен Знать Об Арифметике С плавающей точкой . Тогда необходимо действительно рассмотреть использование некоторого типа фиксированная точка / пакет произвольной точности номер (например, java BigNum, модуль десятичного числа Python) иначе, Вы будете в для мира вреда. Тогда фигура при использовании собственного типа десятичного числа SQL достаточно.

Плавает/удваивает, существуют (редактор) для представления быстрого x87 fp, который является теперь в значительной степени устаревшим. Не используйте их, если Вы заботитесь о точности вычислений и/или не полностью компенсируете их ограничения.

22
ответ дан Rich Schuler 24 November 2019 в 11:06
поделиться

Для банковской системы я помог разработать, я был ответственен за часть "накопления процентов" системы. Каждый день мой код вычислил, сколько процентов было накоплено (earnt) на балансе в тот день.

Для того вычисления, экстремальной точности и точности требовался (мы использовали ПЛАВАНИЕ Oracle), таким образом, мы могли записать "миллиардную часть пенса" быть накопленным.

, Когда это пришло к "капитализированию" процентов (т.е. выплата интереса в Вашу учетную запись) сумма была округлена к пенсу. Тип данных для остатков на счетах был двумя десятичными разрядами. (На самом деле это было более сложно, поскольку это была система с использованием нескольких валют, которая могла работать во многих десятичных разрядах - но мы всегда округлялись к "пенсу" той валюты). Да - там, где "части" потери и усиления, но когда компьютерные числа были реализованы (деньги, которым, выплаченные или заплатили), это всегда были РЕАЛЬНЫЕ денежные значения.

Это удовлетворило бухгалтеров, аудиторов и тестеры.

Так, согласуйте со своими клиентами. Они скажут Вам свое банковское дело/правила бухгалтерского учета и методы.

4
ответ дан Guy 24 November 2019 в 11:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: