2009-07-06 8 views
5

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

Можно ли достоверно сравнить два нецелочисленных значения Oracle NUMBER для равенства, поскольку они хранятся по-разному (base-10)?

ответ

5

Да, типы Oracle NUMBER являются точными. Они больше похожи на целые числа со шкалой, чем с float/double. Таким образом, NUMBER (10,3) имеет 10 цифр, 3 после десятичной точки, что действительно представляет собой 10-значное целое число со шкалой 3. Фактически, это точно, как работают Java BigDecimals (будучи BigInteger плюс масштаб внутри).

+0

любой доступный документ? –

+0

http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/datatype.htm#i16209 – cletus

+0

Нет, они неточны. – Quassnoi

2

Оракул NUMBER типы хранятся в виде наборов значащих цифр (то есть base 100, а не base 10), по одной цифре на каждый байт.

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

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

SELECT 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - 
     10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 
FROM dual 


--- 
0 
0

Oracle гарантирует 38 цифр точности в ряде, хотя 40 могут быть представлены. См. Oracle Concepts для справки.

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