Тип данных SQL для денежных значений с количеством знаков до 15 - PullRequest
0 голосов
/ 08 января 2019

Мне нужно сохранить и выполнить некоторые базовые вычисления (в основном, умножение) для денежных значений, таких как £0.00005756, £0.01, £0.000000000000123 и т. Д. Максимальное количество десятичных разрядов будет 15, но может быть достаточно большими числами на другой стороне тоже. Если на левой стороне больше 0, маловероятно, что будет использовано более 2 десятичных знаков, но это возможно. Числа, с которыми у меня были проблемы, это когда они идут выше 2 десятичных знаков.

Я создал тестовую таблицу и вставил некоторые основные данные. К сожалению, он не может хранить действительно маленькие цифры.

Примечание. Я создал столбец money2 как столбец [decimal](18, 4), так как это рекомендуется, когда я искал, что использовать для денежных значений. Однако мне нужно 15 десятичных знаков, поэтому существует money1.

Создание таблицы:

  CREATE TABLE [dbo].[MoneyTest](
        [id] [int] IDENTITY(1,1) NOT NULL,
        [money1] [decimal](18, 15) NULL,
        [money2] [decimal](18, 4) NULL,
     CONSTRAINT [PK_uMoneyTest] PRIMARY KEY CLUSTERED 
    (
        [id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO

insert into moneytest 
(money1, money2) values
(£0.01,£0.01)

insert into moneytest 
(money1, money2) values
(£0.000000000000123,£0.000000000000123)

insert into moneytest 
(money1, money2) values
(£0.00005756,£0.00005756)

select * from moneytest возвращает следующие результаты:

id  money1              money2
7   0.010000000000000   0.0100
8   0.000000000000000   0.0000
9   0.000100000000000   0.0001

Я ожидал этих результатов, хотя:

id  money1              money2
7   0.010000000000000   0.0100
8   0.000000000000123   0.0000
9   0.000575600000000   0.0001

В частности, строка id 9, кажется, округляется до 1 (в десятичной точке 4) вместо того, чтобы показывать фактическую цифру. Я думал, что это произошло только при использовании столбцов с плавающей запятой, которые оценивают числа и что десятичная дробь должна была быть более точной?

Это просто проблема с типом данных или это то, что я вообще не должен пытаться решить в базе данных?

1 Ответ

0 голосов
/ 08 января 2019

Проблема в знаке фунта. Это означает, что значения читаются как money - что недостаточно высокая точность. Итак, вы теряете десятичные разряды.

Просто удалите символ валюты:

insert into moneytest (money1, money2)
    values (0.000000000000123, 0.000000000000123);

Здесь - это дБ <> скрипка.

...