sql - POWER 不会反转 LOG,反之亦然

标签 sql sql-server math-functions

我对 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/

相关文章:

mysql - 如何连接两个不同的表和两个日期之间的平均值

sql - TSQL 可选 Where 子句

c# - 以编程方式更改 Select 中的属性在 LINQ to SQL 查询中的填充方式

sql-server - VBScript-将SHA1作为数字或二进制值存储在SQL Server中

Mysql - 获取重复结果

sql - 将大型 sql 脚本分成较小的批处理有好处吗?

SQL 服务器 : Compare two columns

javascript - JS 中的数学舍入问题未能实际提供支持小数答案的整数

c# - 在 Unity3d 中导入数学时出错

c++ - std::labs() 到底是为了什么?