Разница в представлении числа с плавающей точкой в ​​свойстве двойного типа (классе) и в поле двойного типа (SQL-запрос) - PullRequest
0 голосов
/ 03 мая 2018

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

Здесь, в классе, вы видите, что некоторые свойства имеют 1 значащую цифру, например. T12, T13, T18, T19 (0,8, 12,1 и т. Д.).

Class view

Однако, когда я выполняю вставку этого класса в таблицу базы данных, Linq2Db производит такой запрос:

Query view

Когда я смотрю в таблицу базы данных, поля содержат правильные однозначные значения:

Database table view

Я прекрасно знаю, как числа с плавающей запятой представляются в двоичном формате. Я уже прочитал статью Почему числа с плавающей точкой неточны? .

Мои вопросы:

  1. Почему представление двойного типа в классе (T12 = -0,8) отличается от представления после того, как им манипулирует Linq2Db (T12 = -0,800 ... 004)?

  2. Безопасно ли сохранять такие двойные значения в базе данных? (Я бы хотел, чтобы не было неточных значений)

  3. Почему существует разница между значениями в запросе и значениями в таблице базы данных?

Редактировать 1:

Это результат запроса к базе данных. 15 значащих цифр (все 0) и 17 значащих цифр (экран выше). При доступе не может отображаться более 15 цифр.

Query on database

Редактировать 2:

Decimal               0.8
Class Double          0.8
Floating-Point Double 0.8000000000000000444089209850062616169452667236328125
Floating-Point Single 0.800000011920928955078125 (for comparison)
SQL Query             0.80000000000000004 (!)  => 17 digits after point (why?)
MS Access             0.800000000000000 = 0.8  => 15 digits after point

Почему тип double в классе может быть 0,8, но в базу данных вставлено то же значение без каких-либо манипуляций или арифметических операций, как 0,80000000000000004? Что с ним делает Linq2Db?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

linq2db использует 17 значащих цифр для представления двойного значения в качестве десятичного литерала SQL, поскольку это минимальное количество цифр, которое позволяет вам возвращать двойное значение в десятичное представление и безопасно возвращать обратно без потери точности.

В вашем случае в этом нет необходимости, поскольку Access (и Excel BTW) не поддерживает более 15 значащих цифр для типа double.

0 голосов
/ 03 мая 2018

Если вам нужно точное представление десятичных значений, переключитесь на decimal, а не на представления с плавающей запятой.

Число типа 0,8 не может быть точно представлено с использованием фиксированного числа двоичных десятичных цифр (однако могут быть 0,5 и 0,75). То, что вы на самом деле видите, зависит от приложения, отображающего результат, а не от способа его хранения.

Итак, просто используйте тип данных, который соответствует тому, что вы действительно хотите, десятичную с фиксированной запятой.

...