Floating point 按文字除法后的红移小数比例

Floating point 按文字除法后的红移小数比例,floating-point,amazon-redshift,Floating Point,Amazon Redshift,试图理解这种行为 CREATE TABLE tab (x DECIMAL(10,0), y DECIMAL(10,0)) INSERT INTO tab VALUES(1, 3) 从选项卡中选择x/y将返回0.3333。。。。至小数点后11位 我不明白的是:如果我除以一个类型相同的文本x/3::decimal10,0,我得到的正好是小数点后4位0.3333 除了使用float先将商写入表中或更糟地写入表中之外,如何对结果的精度/比例进行更细粒度的控制?使用示例选项卡表 select x /

试图理解这种行为

 CREATE TABLE tab (x DECIMAL(10,0), y DECIMAL(10,0))
 INSERT INTO tab VALUES(1, 3)
从选项卡中选择x/y将返回0.3333。。。。至小数点后11位

我不明白的是:如果我除以一个类型相同的文本x/3::decimal10,0,我得到的正好是小数点后4位0.3333


除了使用float先将商写入表中或更糟地写入表中之外,如何对结果的精度/比例进行更细粒度的控制?

使用示例选项卡表

select x / y,
       ((x/ 3::decimal)),
       ((x/ (select 3)::decimal)),
       ((x/ (select 3)::decimal))::decimal(10,6)
       from tab;
返回

0.33333333 0.3333 0.3333333 0.333333

您可以在第三个示例中看到,将3::decimal替换为select 3::decimal大大提高了精度


如果需要设置输出精度,可以像我的第四个示例x/select 3::decimal::decimal10,6那样使用示例选项卡表进行设置

select x / y,
       ((x/ 3::decimal)),
       ((x/ (select 3)::decimal)),
       ((x/ (select 3)::decimal))::decimal(10,6)
       from tab;
返回

0.33333333 0.3333 0.3333333 0.333333

您可以在第三个示例中看到,将3::decimal替换为select 3::decimal大大提高了精度


如果您需要设置输出精度,您可以像我的第四个示例x/从上面的Amazon文档中选择3::decimal::decimal10,6

那样执行此操作:您可能还会遇到计算值比例变化或意外的情况。-FWIW看起来红移忽略了文本的十进制转换,并使用实际精度1而不是转换精度10,这将根据定义的规则产生4的刻度。从上面的Amazon文档:您可能还会遇到计算值的刻度变化或意外的情况。-FWIW看起来红移忽略了文本的转换为十进制,并使用实际精度1而不是转换精度10,根据定义的规则,这将导致4的小数位数。奇怪的是,select 3::decimal的行为不同于3::decimal奇怪的是,select 3::decimal的行为不同于3::decimal