模数,浮点数

时间:2010-12-28 08:26:41

标签: sql-server-2005 tsql floating-point modulo

如何对浮点数使用模数?例如,如何找到

的结果
select power(cast(101 as float),50)%221

3 个答案:

答案 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

虽然这么大但是失败了

但是对于更大的数字来说无论如何都没有意义。

  • 浮动精确到15个显着数字。
  • 101 ^ 50 = 1.64463182184388E + 100
  • 误差范围(浮点近似)比模数221高出约82个数量级(1E + 82)

模数的任何答案都是彻头彻尾的垃圾

编辑:

十进制到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函数应该处理浮点数。但是你显示的计算,浮点数将无法提供足够的精度。当你离开演员阵容时会发生什么?