首页 > 解决方案 > 仅将一个字符串转换为 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

标签: tsql

解决方案


这似乎是一个典型的舍入错误案例。

检查此代码:

declare @val float = convert(real, '1.06') * 200;
select @val; --211,999984741211

您可能会考虑转换为float而不是real,但即便如此,您也可能会遇到舍入错误。

您可能会考虑转换为decimalor numeric,因为这些类型在舍入方面的行为有些不同。但是这些类型使用更多内存并且比real和慢float

也许您可能还想检查舍入函数(如ROUNDFLOOR)是否对您有用。

从设计的角度来看,将数字数据存储在数字类型而不是字符串中几乎总是更好的选择。(数值数据旨在用于执行计算。除此之外,将数值转换为字符串在技术上比将字符串转换为数值更容易和更灵活。)

由您来调查这些(以及其他?)可能的解决方案,然后选择最适合您手头问题的解决方案。


推荐阅读