天天看点

oracle数字类型num比较大小,关于类型:Oracle NUMBER比较

通常,在编程中,不应比较浮点数据类型的相等性,因为存储的值通常是近似值。

由于两个非整数的Oracle NUMBER值存储方式不同(基数为10),是否可以可靠地比较它们的相等性?

是的,Oracle NUMBER类型是精确的。 与浮点/双精度类型相比,它们更像是带刻度的整数。 因此NUMBER(10,3)具有10位数字,在小数点后3位,这实际上是10位整数,小数位数为3。实际上,这就是Java BigDecimals的工作方式的精确之处(内部是BigInteger加上小数位数)。

有任何可用的文档吗?

download.oracle.com/docs/cd/B19306_01/server.102/b14220/

不,它们不精确。

如果两个NUMBER类型包含一个数字(例如10.32)并且您将它们进行比较,则它们将相等,并且无论如何获取10.32都无关紧要。 这与浮点数不同。 在NUMBER类型中为0.1 + 0.1 + 0.1 + 0.1 + 0.1 = 0.5,但在浮点数学中则不需要。 这就是我所说的精确值(假设NUMBER类型的小数位数至少为1)。

Quassnoi,请详细说明。

Oracle NUMBER类型存储为一组百位数(即base 100,而不是base 10),每个字节一位。

第一个字节代表指数,其他字节代表尾数。

这意味着对于非常大的数字,甚至整数也可以取整:

SELECT  10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -

10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001

FROM    dual

---

Oracle可以保证NUMBER中的38位精度,尽管可以表示40位。 有关参考,请参见Oracle Concepts。