sql-server - 为什么 DECIMAL 的行为类似于 FLOAT?
问题描述
尽管它DECIMAL
是一个精确的数字类型(不像FLOAT
,它是近似的),但它在以下示例中的行为相当奇怪:
DECLARE @DECIMAL_VALUE1 DECIMAL(20,9) = 504.70 / 0.151562
DECLARE @DECIMAL_VALUE2 DECIMAL(20,0) = 504.70 / 0.151562
DECLARE @INTEGER_VALUE INT = 504.70 / 0.151562
SELECT
@DECIMAL_VALUE1 AS DECIMAL_VALUE1, -- 3329.990366978
@DECIMAL_VALUE2 AS DECIMAL_VALUE2, -- 3330
@INTEGER_VALUE AS INTEGER_VALUE -- 3329
3329 以外的值会导致我们的应用程序出现错误。将变量类型设置为INTEGER
解决了我们的问题,但我无法理解为什么它是首先引起的。
解决方案
你问,“为什么它首先是造成的”:
要了解为什么需要了解每种数据类型的性质以及它在 SQL Server 中的运行方式。
- 整数数学会截断小数(无舍入,与“FLOOR”函数相同(这就是你得到 3329 的原因))。
- 0 位四舍五入的小数(这就是为什么你得到 3330 作为 3329.99 向上舍入的原因)
- 精度/比例四舍五入到第 N 比例的小数(这就是为什么你得到 3329.990366978...)。
所以这不是意外的行为,考虑到所涉及的数据类型,这是预期的。这可能只是意料之外的行为。在遇到它们之前,每种数据类型的细微差别都是有问题的。
我会选择忽略浮动评论,因为它与问题无关。
推荐阅读
- azure - 是否有任何方法可以增加 Azure Logic App 中 rest api 调用的请求超时?
- javascript - React Hooks & UseEffect 不使用 socketIO 数据更新显示。只渲染数组中的元素
- r - 使用have::labelled动态创建价值标签,跟进
- php - 如何将附加参数传递给 Laravel 登录控制器中的 handleProviderCallback 函数
- python - PyMongo 查询问题:递增嵌套的 dict 条目
- css - 这个序列的第 n 项是什么?
- c# - BizTalk 自定义管道组件 - 读取 JSON 节点值并提升属性
- terraform - 无服务器部署到不同的 AWS 账户
- javascript - React js:将 props 传递给 React Router 的 Link 组件
- u-boot - U-boot:如何检查 tftp 命令是否成功将映像加载到 ram 中?