【发布时间】:2010-12-28 08:26:41
【问题描述】:
如何对浮点数使用模?例如,如何找到结果
select power(cast(101 as float),50)%221
【问题讨论】:
-
-1 表示受到数学挑战,将 SQL Server 与 Windows 计算器进行比较。
标签: sql-server-2005 tsql floating-point modulo
如何对浮点数使用模?例如,如何找到结果
select power(cast(101 as float),50)%221
【问题讨论】:
标签: sql-server-2005 tsql floating-point modulo
在某些情况下,可能需要对大数使用模,一种方法是使用小数(因为 int 和 bigint 可能太小)。
您必须自己实现模运算符 - 一种方法是:
SELECT (x/y-ROUND(x/y,0,1))*y
ROUND(x/y,0,1) 函数返回截断的x/y。例如,
(10.0/3 - ROUND(10.0/3,0,1))*3 = (3.333333-3)*3 = 1
这在解决诸如 24840081102364802172700 mod 97 之类的大整数的模运算时很方便:
SELECT (CAST(24840081102364802172700 AS DECIMAL(23,0))/97 - ROUND(CAST(24840081102364802172700 AS DECIMAL(23,0))/97 ,0,1)) *97 = 10.0
最后你也可以完全四舍五入。
【讨论】:
对于较小的数字,您必须转换为十进制
select cast(power(cast(101 as float),50) as decimal(38,0)) % 221
或
select power(cast(101 as decimal(38,0)),50) % 221
虽然数量如此之大,但它失败了
但是对于更大的数字来说无论如何都没有意义。
任何取模的答案都是垃圾
编辑:
十进制约为 10^38
在 10^39 或 1E+39 处取一个浮点数,然后您将精确到 1E24 左右(15 个重要数字)。
你的模数是 221 = 2.2E+2
您的误差范围即 1E+24/2.2E+2 = 4.4E+21
为了 100% 清楚,您的准确度是模数的 4,400,000,000,000,000,000,000,000 倍。
它甚至不是近似值:它是垃圾
【讨论】:
如果 SQL Server 支持,mod 函数应该处理浮点数。但是您显示的计算,浮点数将无法提供足够的精度。当你离开演员阵容时会发生什么?
【讨论】: