2014-01-30 6 views
2

Я в настоящее время импортирую набор данных, который включает значения валюты в базу данных Access. Хотя я читал, что должен использовать десятичный тип данных для валюты, могу ли я не использовать double, чтобы сократить размер файла, если значения округлены до ближайшего доллара?Десятичный или двойной при хранении округленных значений валюты в базе данных Access?

Насколько я могу судить, проблема с использованием double для валюты связана с округлением, но я не буду делать вычисления по данным напрямую. Любые вычисления будут выполняться приложением/пользователем.

Аналогично, поскольку данные фиксированной длины, некоторые из десятичных значений представлены целыми числами. Например, некоторые поля могут содержать значение 12345, но фактическое значение равно 12.345. Это требует, чтобы я импортировал данные, а затем обновил значения; разделив на 1000 в приведенном выше примере.

Будет ли использовать double в этой моде также ошибки округления?

+0

Если они целые числа, не могли бы вы сделать столбец целым числом? – dan04

+1

Это был мой первоначальный подход, но некоторые из значений в моих таблицах слишком велики. К сожалению, даже тип данных «Long Integer» в Access может принимать только значения от -2,147,483,648 до +2,147,483,647. – toolshed

ответ

4

Да, подразделения могут и будут вводить ошибки округления.

Вы хотите использовать «валюту» для любого вида программного обеспечения для бизнеса. Фактически, если у вас нет типа данных валюты, вы используете целые числа SCALED (вы масштабируете результаты). Таким образом, вы храните

$ 123,52

As

(Если предположить 4 знака после запятой)

Причина, конечно, "реальные" цифры в компьютерах только представление и только приблизительные - они подлежат округлению.

Это SIMPLE код:

Public Sub TestAdd() 

    Dim MyNumber  As Single 
    Dim i      As Integer 

    For i = 1 To 10 
     MyNumber = MyNumber + 1.01 
     Debug.Print MyNumber 
    Next i 
    End Sub 

    Here is the actual output of the above: 

    1.01 
    2.02 
    3.03 
    4.04 
    5.05 
    6.06 
    7.070001 
    8.080001 
    9.090001 
    10.1 

Представьте выше - всего лишь после 7 SIMPLE и глупое дополнение мы уже получаем неправильные ответы. И VBA даже в Excel сделает ТО ЖЕ. Итак, как отмечено, мы используем 0.01, но это только приблизительное! (так что, пока мы предполагаем, что это значение составляет 1/100-е, оно приближается только при использовании «реального» формата на компьютерах.

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

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

Я не могу думать о каких-либо преимуществ с точки зрения пространства для хранения, если вы не храните много миллионов строк данных. Меньше хуже, если вы экспортируете эти данные в какую-либо другую систему, тогда экспорт «реальных» чисел может ввести все родственники ds артефактов и даже экспонентов при экспорте - используйте валюту - вы будете в безопасности в том, что видите и имеете.

+0

Итак, следует ли использовать масштабированное целое число или использовать тип данных «Десятичный»? К сожалению, некоторые из значений в моей таблице превышают то, что может быть сохранено даже в «Long Integer». Должен ли я полагаться на «Двойной», чтобы иметь очень большие масштабированные целые числа, или это исключительно для с плавающей запятой?Я понимаю, что целью «Десятичная» является размещение чисел с фиксированной точкой для предотвращения таких ошибок. – toolshed

+0

Я бы использовал тип данных валюты, если цифры соответствуют. Если валюта не будет обрабатывать ваши номера, тогда я да, используя десятичный вариант, будет моим следующим выбором. Не понятно, сколько значащих цифр, но двойной часто работает нормально, так как есть достаточно значительных цифр (15), что любое «незначительное» округление не будет отображаться. Однако, похоже, мы перешли с 4-х десятичных знаков, и теперь то, что вы говорите, не будет вписываться в длинное целое число, и это довольно простое изменение. Так что да, вы лучше поставите, то, скорее всего, десятичный (это масштабированное целое число, несмотря на название «десятичный». –

+0

Спасибо, вы очень хорошо осведомлены! Итак, целочисленное значение имеет предел значений, а с плавающей запятой - предел цифр, 15 для двойного Правильно? Максимальное количество цифр после десятичного числа равно 4, но большинство полей имеют только 2. Long Int не будет работать, потому что у меня есть значения, которые превышают -2,147,483,648 до 2,147,483,647. Наибольшее количество сиг-фигов составляет 10, все слева от десятичной, т. е. целых чисел. Поскольку значения больше, чем позволяет Long Int, я вынужден использовать double независимо? Кроме того, у Access нет типа валюты, только формат валюты для десятичного числа. – toolshed

Смежные вопросы