我有一个非常奇怪的场景,我相信这是一个解释.
我试图计算一些东西,这里是值:
SELECT 145.28/63 *(8 * 100) / 100 -- returns: 18.4482480000
Run Code Online (Sandbox Code Playgroud)
问题是这不正确,如果我用Windows Calculator进行计算,那么它会返回一个更精确的值:
145,28/63*(8 - 0*100)/ 100 = 18,44825396825397
我不得不改变很多以使它与SQL Server一起工作:
SELECT 145.28 * 100 * 8 / (100 * 63) --RETURNS: 18.4482539682539
Run Code Online (Sandbox Code Playgroud)
为什么我需要更改SQL Server中的数字,而不是在Windows中?
在Navision编程中,它返回正确的值18.4482539682539682
自动分配的默认数据类型不会保持您想要的精度.通过将第一个数字显式地转换为更精确的数据类型,可以很容易地解决这个问题,如下所示:
SELECT CAST(145.28 AS decimal(38,35))/63 *(8 * 100) / 100
--returns 18.448253968253968253968253
Run Code Online (Sandbox Code Playgroud)
从那里出来sql server了解不要向下转,所以结果变成了18.448253968253968253968253
十进制的语法是十进制(总位置,逗号后面).不要忘记逗号也占有一席之地.
这是一个文档链接.
如果要限制小数,可以像这样使用ROUND:
SELECT ROUND(CAST(145.28 AS float)/63 *(8 * 100) / 100,12)
Run Code Online (Sandbox Code Playgroud)
在sql server中可以达到的最大精度(无论如何都是单个值)是18.448253968253968253968253
来自ms的每个链接文档:
十进制[(p [,s])]和数字[(p [,s])]
固定精度和标度数.当使用最大精度时,有效值为 - 10 ^ 38 +1到10 ^ 38 - 1.十进制的ISO同义词是dec和dec(p,s).numeric在功能上等效于十进制.
| 归档时间: |
|
| 查看次数: |
154 次 |
| 最近记录: |