为什么在DB2上执行以下SQL语句会返回 * 0.1
?
select FLOAT(0.1) from sysibm.sysdummy1
我期待像REAL(0.1)
这样的近似结果;
四舍五入为什么以及在哪里发生?
*使用Visual Explain
答案 0 :(得分:2)
这只是猜测,但许多系统在格式化输出的浮点值时,会打印出比结果更接近任何其他浮点数的最短数字。由于FLOAT是双精度而REAL是单精度,它们将“0.1”舍入到不同的二进制近似值,并且很可能对于其中一个,0.1更接近舍入值而不是格式的任何其他值,而另一方则不然。
答案 1 :(得分:1)
0.1位十进制值的32位(单精度)和64位(双精度)表示之间存在差异。您可以使用在线IEEE 754 calculator查看。
32 bit: 0.09999999403953552 (3DCCCCCC)
64 bit: 0.1 (3FB999999999999A)
我检查了IBM DB2 documentation,实际上FLOAT函数是DOUBLE的同义词,所以它返回64位表示, exact 显示为近似值0.1。
REAL函数返回一个 单精度浮点数 代表一个数字。
FLOAT函数返回一个 a的浮点表示 数。 FLOAT是DOUBLE的同义词。