Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 模,浮点数_Sql Server 2005_Tsql_Floating Point_Modulo - Fatal编程技术网

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)
模的任何答案都是一派胡言

编辑:

小数点约为10^38

以10^39或1E+39为浮点数,则精确到1E24左右(15个重要数字)

你的模是221=2.2E+2

你的误差范围是1E+24/2.2E+2=4.4E+21

为了100%清楚,您的精度是您的模的4400000000000000000倍


它甚至不是近似值:它是垃圾。如果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