sql хранит другое значение, тогда я храню - PullRequest
0 голосов
/ 12 апреля 2011

Я использую SQL Server 2005 и .NET.У меня есть таблица с плавающей колонкой с именем «цена».Когда я храню 1890, он хранит 1889.99966796875.

В чем причина?

Ответы [ 3 ]

5 голосов
/ 12 апреля 2011

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

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

3 голосов
/ 12 апреля 2011

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

1889.99966796875 - это число, которое является самым близким к 1890 в этой области с плавающей запятой, поэтому самое близкое это число может быть достигнуто с помощью двоичного представления.

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

простой пример: 0,3 в моей двоичной системе:

0.1b (inary) would be 0.5 d (ecimal) so too much...
0.01b -->  0.25d (1/4 too little)
0.011 -->  0.375 (1/4 + 1/8 too much)
0.0101 --> 0.3125 (1/4 + 1/16 still too much)
...
0.010011 --> 1/4 +1/32 + 1/64 = 0.296875

Предположим, что моя система имеет 6 бит для представления дроби, 0,296875 будет ближайшим для этой области. Правильное число не может быть достигнуто из-за десятичной / двоичной системы.

Примеры см. Также: Примеры погрешностей с плавающей точкой

И отличное детальное объяснение ваших проблем можно найти здесь: http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

Еще одно замечание: на самом деле речь идет о несоответствии, а не о «качестве» систем: например, в десятичной записи вы не можете представить точность на 1/3 100%, в то время как в других системах это вполне возможно.

2 голосов
/ 12 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...