tsql - 仅将一个字符串转换为 tinyint 时出现明显的算术错误
问题描述
有一个字符串数字表,其中所有值都是 '0.80 到 '1.10'。转换为 tinyint 查找索引仅给出一个值的算术错误......'1.06',我不明白为什么。
select @@version
select 1.06 * 200
select convert(tinyint, 1.06 * 200)
select convert(real, '1.06') * 200
select convert(tinyint, convert(real, '1.06') * 200)
给...
Microsoft SQL Server 2014 (SP3-CU-GDR) (KB4535288) - 12.0.6372.1 (X64)
212.00
212
212
211
解决方案
这似乎是一个典型的舍入错误案例。
检查此代码:
declare @val float = convert(real, '1.06') * 200;
select @val; --211,999984741211
您可能会考虑转换为float
而不是real
,但即便如此,您也可能会遇到舍入错误。
您可能会考虑转换为decimal
or numeric
,因为这些类型在舍入方面的行为有些不同。但是这些类型使用更多内存并且比real
和慢float
。
也许您可能还想检查舍入函数(如ROUND
和FLOOR
)是否对您有用。
从设计的角度来看,将数字数据存储在数字类型而不是字符串中几乎总是更好的选择。(数值数据旨在用于执行计算。除此之外,将数值转换为字符串在技术上比将字符串转换为数值更容易和更灵活。)
由您来调查这些(以及其他?)可能的解决方案,然后选择最适合您手头问题的解决方案。
推荐阅读
- javascript - 用 combineLatest 匹配两个 Observable 数据对象
- webpack - webpack 4.5 设置代理公司
- javascript - 多人游戏 NodeJS、HTML、JS - 服务器/客户端验证
- c# - 实体类型“Microsoft.AspNetCore.Identity.IdentityRole”处于阴影状态
- reactjs - 如何使用 Jenkins Blue Ocean 测试反应应用程序?
- javascript - 在 ember 中出现未捕获的错误
- c# - odata 格式 xml 或 json 不起作用
- angular - 在Angular 5中使用无组件路由路由到子节点时的意外行为
- java - 保存 ScrollView 位置
- android - 通过 Data 类发送类对象