binary_double 不应该在 Oracle 中存储比数字更高的值吗?
Shouldn't binary_double store a higher value than number in Oracle?
考虑以下测试代码:
CREATE TABLE binary_test (bin_float BINARY_FLOAT, bin_double BINARY_DOUBLE, NUM NUMBER);
INSERT INTO binary_test VALUES (4356267548.32345E+100, 4356267548.32345E+2+300, 4356267548.32345E+100);
SELECT CASE WHEN bin_double>to_binary_double(num) THEN 'Greater'
WHEN bin_double=to_binary_double(num) THEN 'Equal'
WHEN bin_double<to_binary_double(num) THEN 'Lower'
ELSE 'Unknown' END comparison,
A.*
FROM binary_test A;
我试过看看哪个存储了更高的值。如果我尝试为数字和 binary_float 列添加 E+300,则会出现 returns 数字溢出错误。所以,我想我可以用 binary_float 存储更大的值。
然而,当我试图检查它时,它显示了一个较低的值,并且通过案例比较它说它也较低。能否详细说明一下这种情况?
您正在将值 4356267548.32345E+2+300 插入到二进制双精度列中。其计算结果为 4356267548.32345E+2,即 435626754832.345,加上 300 - 即 435626755132.345(或 4.35626755132345E+011,转换为二进制双精度值时变为 4.3562675513234497E+011)。这明显低于 4356267548.32345E+100(或 4.35626754832345E+109,转换为二进制双精度后变为 4.3562675483234496E+109)。
不直接相关,但您还应注意,您提供的是十进制数字文字,在插入期间将隐式转换为二进制双精度数字。所以你不能使用 4356267548.32345E+300,因为它对于 number 数据类型来说太大了。如果你想指定 a binary double literal 那么你需要附加一个 d
到它,即 4356267548.32345E+300d;但这还是太大了。
您可以使用该数字部分的最高值是 4356267548.32345E+298d,计算结果为 4.3562675483234498E+307 - 仅低于 1.79769313486231E+308 的 the data type limit;并注意精度损失。
考虑以下测试代码:
CREATE TABLE binary_test (bin_float BINARY_FLOAT, bin_double BINARY_DOUBLE, NUM NUMBER);
INSERT INTO binary_test VALUES (4356267548.32345E+100, 4356267548.32345E+2+300, 4356267548.32345E+100);
SELECT CASE WHEN bin_double>to_binary_double(num) THEN 'Greater'
WHEN bin_double=to_binary_double(num) THEN 'Equal'
WHEN bin_double<to_binary_double(num) THEN 'Lower'
ELSE 'Unknown' END comparison,
A.*
FROM binary_test A;
我试过看看哪个存储了更高的值。如果我尝试为数字和 binary_float 列添加 E+300,则会出现 returns 数字溢出错误。所以,我想我可以用 binary_float 存储更大的值。 然而,当我试图检查它时,它显示了一个较低的值,并且通过案例比较它说它也较低。能否详细说明一下这种情况?
您正在将值 4356267548.32345E+2+300 插入到二进制双精度列中。其计算结果为 4356267548.32345E+2,即 435626754832.345,加上 300 - 即 435626755132.345(或 4.35626755132345E+011,转换为二进制双精度值时变为 4.3562675513234497E+011)。这明显低于 4356267548.32345E+100(或 4.35626754832345E+109,转换为二进制双精度后变为 4.3562675483234496E+109)。
不直接相关,但您还应注意,您提供的是十进制数字文字,在插入期间将隐式转换为二进制双精度数字。所以你不能使用 4356267548.32345E+300,因为它对于 number 数据类型来说太大了。如果你想指定 a binary double literal 那么你需要附加一个 d
到它,即 4356267548.32345E+300d;但这还是太大了。
您可以使用该数字部分的最高值是 4356267548.32345E+298d,计算结果为 4.3562675483234498E+307 - 仅低于 1.79769313486231E+308 的 the data type limit;并注意精度损失。