![]() |
1
2
答案在于计算机如何在内部表示数字。根据使用的精度,SQL Server将分配5、9、13或17个字节来表示您的数字(请参见 http://msdn.microsoft.com/en-us/library/ms187746(v=SQL.90).aspx )因此,例如,当您从精度30移动到精度20时,内部表示从17字节移动到13字节。如何在17字节的数字上设置小数位数,而在13字节的数字上,数字表示的更大比例专用于小数位数(15/30=0.5,15/20=0.75),则会更改舍入行为。没有完美的答案。我们拥有的数字类型对于大多数应用程序来说已经足够好了,但有时由于我们在表示计算机中的数字方面的妥协,您会看到一些奇怪的工件。 作为旁白,要非常非常小心浮点数类型。它们只是粗略地近似数字,当使用数量时会给你非常错误的结果。当在一次计算中使用不超过20个浮点数时,它们在大多数科学应用中都是极好的。在数量上使用时,比如在一个和(列名)中添加100万个浮点数,就会得到垃圾。演示如下:
这在SQL Server 2008上给出了以下答案。
|
![]() |
2
3
这在粘贴的链接底部很重要:
对于精度为30的所有结果,最终计算精度为61。由于最大可能的精度是38,由此产生的精度降低了23。因此,所有的尺度都在减小,以避免在绝对必要的情况下截断结果的积分部分。 第二个到最后一个值,其中每个值的精度为20,结果精度为41,只需减少3,在刻度部分留下可能较轻的减少。 (30,15)之所以有效,是因为合成比例是30,所以,当它减小时,它仍然足够大,可以容纳所需的值。 教训:不要使精度和比例超过你需要的范围,否则你会得到奇怪的结果。 |
![]() |
John D · 需要为NULL或NOT NULL的WHERE子句 8 月前 |
![]() |
Marc Guillot · 记录值时忽略冲突 9 月前 |
![]() |
Fachry Dzaky · 正确使用ROW_NUMBER 9 月前 |
![]() |
TriumphTruth · 从满足特定条件的数据集中选择1行 9 月前 |