我对 POWER/LOG 的问题是,虽然它们似乎适应您发送的数据类型(输出变量类型与第一个变量的类型匹配),但精度似乎停止接近 float 的限制,导致输出不正确。 示例:
DECLARE @ten numeric(18,4) = 10
declare @num numeric(18,4) = 234567890
SELECT power(@ten,log(@num,@ten))
输出 = 234567890.0000 哪个是正确的
但是,如果我们提高精度,如下所示:
DECLARE @ten numeric(18,6) = 10
declare @num numeric(18,6) = 234567890
SELECT power(@ten,log(@num,@ten))
输出 = 234567889.999999 这是不正确的,但四舍五入可以修复它(?)
最后,如果将精度更改为 Numeric(18,9) 之类的值,问题会变得更糟:
DECLARE @ten numeric(18,9) = 10
declare @num numeric(18,9) = 234567890
SELECT power(@ten,log(@num,@ten))
输出 = 234567889.999999310 这是不正确的,四舍五入无法修复它。
我假设问题是虽然 POWER 和 Log 函数可以接受非常精确的数据类型,但它们的工作变量必须是浮点类型?有人有这方面的经验吗?或者有解决这个问题的经验吗?
最佳答案
我认为问题在于 LOG
的返回类型是FLOAT
,而不是您传入的数据类型。FLOAT
是与 float 值数据一起使用的近似数字数据类型。 float 据是近似值;因此,并非数据类型范围内的所有值都可以准确表示。
另一方面,POWER
接受 float 类型或可隐式转换为 float 类型的表达式。作为输入,并返回取决于 float 表达式的输入类型的类型。意思是,对于DECIMAL
的输入,它将返回DECIMAL
。
因此,在您的情况下,LOG
返回一个 FLOAT
,该 FLOAT 被传递到 POWER
,后者返回一个 FLOAT
正如所引用的那样,这并不准确。
关于sql - POWER 不会反转 LOG,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54028582/