Sql server 2005 模,浮点数
如何对浮点数使用模?例如,如何查找Sql server 2005 模,浮点数,sql-server-2005,tsql,floating-point,modulo,Sql Server 2005,Tsql,Floating Point,Modulo,如何对浮点数使用模?例如,如何查找 select power(cast(101 as float),50)%221 对于较小的数字,您必须转换为十进制 select cast(power(cast(101 as float),50) as decimal(38,0)) % 221 或 但由于数量如此之多,这一点是失败的 但对于更大的数字来说,这是毫无意义的 浮点数精确到15个重要数字 101^50=1.6446318218388E+100 误差幅度(浮点近似)比模221高约82个数量级(
select power(cast(101 as float),50)%221
对于较小的数字,您必须转换为十进制
select cast(power(cast(101 as float),50) as decimal(38,0)) % 221
或
但由于数量如此之多,这一点是失败的
但对于更大的数字来说,这是毫无意义的
- 浮点数精确到15个重要数字
- 101^50=1.6446318218388E+100
- 误差幅度(浮点近似)比模221高约82个数量级(1E+82)
它甚至不是近似值:它是垃圾。如果SQL Server支持它,mod函数应该处理浮动。但是,在您显示的计算中,浮点不能提供足够的精度。取消强制转换时会发生什么情况?在某些情况下,可能需要对大数使用模运算,一种方法是使用十进制(因为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
你也可以在最后把它全部取整。它会爆炸:结果只适用于一个浮点数。这只是一个例子。我可以用任何数字作为除数或除数。所以,我使用float。有没有办法将%应用于浮点数?不幸的是,我不能。我的数字可能会超过decimal@kkab:在这种情况下,您回到我关于误差幅度的评论。如果超过1E38(十进制限制),则必须转到浮点。221大约是2E2。例如,在1E39,使用15个sig数字(1E15),您的数字精度(1E39-1E15=1E24)和2E2之间的误差范围为5E21。这是一个5000000000000000000的误差,比你的除数221大。所以你的模没有意义。那么,你怎么假设windows计算器是如何计算的呢?结果是:功率(101,50)%221=35@kkab:“windows计算器”不是“SQL Server”。它不会使用“float”。我相信谷歌会告诉你它是如何在某处完成的。-1感谢在数学上受到挑战,将SQL Server与Windows Calculator进行比较。
SELECT (CAST(24840081102364802172700 AS DECIMAL(23,0))/97 - ROUND(CAST(24840081102364802172700 AS DECIMAL(23,0))/97 ,0,1)) *97 = 10.0