大家好,又见面了,我是你们的朋友全栈君。
通常,在编程中,不应比较浮点数据类型的相等性,因为存储的值通常是近似值。
由于两个非整数的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
—
0
Oracle可以保证NUMBER中的38位精度,尽管可以表示40位。 有关参考,请参见Oracle Concepts。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163910.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...