如何对浮点数使用模数?例如,如何找到
的结果select power(cast(101 as float),50)%221
答案 0 :(得分:2)
有些情况下可能需要对大数字使用模数,而一种方法是使用小数(因为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
你最后也可以完全围绕它。
答案 1 :(得分:1)
对于较小的数字,您必须转换为十进制
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倍。
它甚至不是近似的:它是垃圾
答案 2 :(得分:0)
如果SQL Server支持它,mod函数应该处理浮点数。但是你显示的计算,浮点数将无法提供足够的精度。当你离开演员阵容时会发生什么?