郑州做设计公司网站,工艺品网站建设开发,优化网站seo公司,网站建设电影最近碰到同事发来这样两个SQL#xff0c;开发反馈输出的结果异常。
bill# select 0.1284*100::float;?column?
--------------------12.839999999999998
(1 row)bill# select (0.1284*100)::float;float8
--------12.84
(1 row) 乍一看其实能看出明显的区别#xff0c;由于…最近碰到同事发来这样两个SQL开发反馈输出的结果异常。
bill# select 0.1284*100::float;?column?
--------------------12.839999999999998
(1 row)bill# select (0.1284*100)::float;float8
--------12.84
(1 row) 乍一看其实能看出明显的区别由于::符号的优先级是高于*的所以没加括号导致结果不同。但是对于第一个SQL输出的结果却很奇怪为什么会输出这样一个数字而且将0.1284改成0.1184也不会有问题这就让人有点费解了。
bill# select 0.1184*100::float;?column?
----------11.84
(1 row) 于是我在几个不同版本的pg实例中测试了下发现pg12及以后的版本均有这种情况于是看了下12的release notes发现如下的更新 可以看到在pg12中使用新的算法输出real和double precision值来提高性能。同时对于extra_float_digits这个参数也有原先默认的0改成了现在默认为1。关于这个参数的含义及用法之前我也有写过文章说明过这里就不在阐述。 按照官方建议可以将该参数设置为0与原先低版本保持一致。
bill# show extra_float_digits ;extra_float_digits
--------------------1
(1 row)bill# set extra_float_digits 0;
SET
bill# select 0.1284*100::float;?column?
----------12.84
(1 row) 那么还有最后一个问题为什么前面会输出12.839999999999998这么一串数字呢可以看到前面的说明中有提到当extra_float_digits大于零时现在是默认值只输出保留精确二进制值所需的最小数字。 这个是什么意思呢由于前面我们输出的是float类型当extra_float_digits1时最多保留17位但是由于新的浮点数输出算法只要二进制相同那么只保留到能得到该二进制的最小位数即可。 换句话说12.839999999999998和12.84的二进制值是一样的大家可以计算下都是1100.110101110000101001也就是说对于该数而言两者是相等的。从下面也可以验证。
bill# select 12.839999999999998::float;float8
--------12.84
(1 row)