不精确的查询带来不同的结果

Jun*_*yhé 1 sql-server t-sql sql-server-2012

我从 Excel 粘贴了一个公式并粘贴到 SQL Server Management Studio。

一旦我执行它,我得到一个意想不到的结果:

SELECT (((10320238-2092189)/2092189)*100.0)/4.0 --returns 75.000000
Run Code Online (Sandbox Code Playgroud)

但是在对查询中的每个值添加精度后,它返回正确的结果:

SELECT (((10320238.0-2092189.0)/2092189.0)*100.0)/4.0 --returns 98.31866289250000
Run Code Online (Sandbox Code Playgroud)

为什么第一个查询不会带来 98% 的结果?的内部数据类型是10320238什么?是integer吗?

发动机是

Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 
    Oct 20 2015 15:36:27 
    Copyright (c) Microsoft Corporation
    Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 5

它被称为“整数数学”——当你将两个整数相除时,任何余数都会被丢弃。相比:

SELECT integers = (10320238-2092189)/2092189, 
       decimals = (10320238.0-2092189.0)/2092189.0;
Run Code Online (Sandbox Code Playgroud)

结果:

integers    decimals
--------    ------------
3           3.9327465157
Run Code Online (Sandbox Code Playgroud)

联机丛书中分区主题

如果整数被除数除以整数除数,则结果是一个整数,该整数的任何小数部分都被截断。