sin() 的 postgreSQL 计算在一个 PosgreSQL 函数中除以零,而在另一个函数中不这样做



有一个SQL调用由两个通用部分组成。第一个是有效的,而第二个是注释掉

select(2200 +
600 *
round(abs(sin(((1) * 0.042))) + 0.1) *
(sin(sin(((1) * 2 / 2 / 2.155172413793103 * PI()))) /
abs(sin(sin(((1) * 2 / 2 / 2.155172413793103* PI()))))) * --here is the division
(3 - exp(-12.5 + floor((1) * 2 / 2 / 2.155172413793103) * 2.155172413793103 * PI() * 2 * round(abs(sin(((1) * 0.042))) + 0.1) - (1 * 2 * PI())))
+
--600 *
--        abs(round(abs(sin(((1) * 0.042))) + 0.1) - 1) *
--        (sin(sin(((1) / 2 / 4.310344827586207 * PI()))) /
--        abs(sin(sin(((1) / 2 / 4.310344827586207 * PI()))))) * --here is the second division that causes the rpoblem
--        (3 - exp(-25.5 + floor((1) / 2 / 4.310344827586207) * 4.310344827586207 * PI() * 2 * abs(round(abs(sin(((1) * 0.042))) + 0.1) - 1) - (1 * PI())))
+50 * sin(3 + 1 * 0.092) + 350 * sin(3 + 1 * 0.012));

所以,问题是为什么

RROR:  division by zero
********** Error **********
ERROR: division by zero
SQL state: 22012

只有当第二部分被注释掉时,才会出现错误。发生分裂的部分都是一样的:

abs(sin(sin(((1) * 2 / 2 / 2.155172413793103 * PI()))))) *

abs(sin(sin(((1) / 2 / 4.310344827586207 * PI()))))) *

它们都应该为零,或者为零。但只有第二个能把除法降到零。

这里的根本原因是什么?在第二种状态下,我能避免吗?有没有一种类型的cas,或者其他什么?

这是因为整数除法和浮点(十进制(除法的行为不同。

遵循BODMAS规则:

例1:

  1. (1(*2/2/2.15 5172413793103
  2. 1*2/2/22.155172413793103
  3. 1*1/2.155172413793103
  4. 1*0.464
  5. 0.464

例如2:

  1. (1(/2/4.310344827586207
  2. 4.310344827586207年1月2日
  3. 0/4.310344827586207
  4. 0

因此,1/2=0(整数除法(和1/2.0=0.5(浮动分割(

即使更正了此错误,表达式也会返回不同的结果,因为后面跟有机器的BODMAS优先级顺序(除法、乘法、加法、减法的括号(。

最新更新