2015-05-20 5 views
0

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

>SELECT ((36.7300 - 20.4300) - 16.3) AS Amount; 
>-3.5527136788005e-15 

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

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

>SELECT 36.7300 - 20.4300 AS Amount; 
>16.3 

>SELECT 16.3 - 16.3 AS Amount; 
>0.0 

ответ

1

Это происходит потому, что SQLite использует двоичную арифметику вместо арифметики base-10.

Из SQLite FAQ:

(16) Почему ROUND (9.95,1) вернуться 9,9 вместо 10,0? Разве 9.95 не округлить?

SQLite использует двоичную арифметику и в двоичной системе, не существует никакого способа, чтобы написать 9,95 в конечном числе бит. Ближайшим к вам может стать 9.95 в 64-битном IEEE-плавании (это то, что использует SQLite): 9.949999999999999289457264239899814128875732421875. Поэтому, когда вы вводите «9.95», SQLite действительно понимает, что число должно быть намного длиннее , показанное выше. И это значение округляется.

Эта проблема возникает при работе с плавающими точечными двоичными числами. Общее правило, которое следует помнить, состоит в том, что большинство дробных чисел, которые имеют конечное представление в десятичной форме (a.k.a «base-10»), не имеют конечного представления в двоичном формате (a.k.a «base-2»). И поэтому они аппроксимируются с использованием ближайшего двоичного номера . Это приближение, как правило, очень близко, но оно будет слегка выключено и в некоторых случаях может привести к тому, что ваши результаты будут , немного отличающимися от ожидаемых.

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

  • магазина вашей сумма без десятичных знаков и вычислить целочисленные операциям
  • Возвращаясь вашими реала и сделать математику из базы данных
  • Круглый ваш результат из базы данных

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

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