SQL Real vs Float

时间:2012-05-22 18:12:15

标签: sql sql-server

假设我有以下两个问题:

select sum(cast(2666 as float)) * cast(.3 as float)
select sum(cast(2666 as real)) * cast(.3 as real)

第一个查询返回:799.8
第二个查询返回:799.800031781197

为什么第二个查询不会返回与第一个查询相同的内容?

1 个答案:

答案 0 :(得分:19)

二进制浮点类型(如real和float)不能精确表示十进制数。特别是,不可能将0.3精确地存储为二进制浮点数。而是存储非常接近0.3的数字。这称为表示错误。

对于real和float,错误的大小不同,因为它们具有不同的精度。

如果您想更准确地存储十进制数,请考虑使用decimal or numeric。但请注意,即使这些类型可以准确地将十进制值存储到一定数量的数字,但计算仍然可以生成无法准确表示的数字。例如,即使0.1 / 0.3decimal都可以,0.1的结果也无法准确存储在0.3中。在这种情况下,结果将四舍五入到可以存储在类型中的最近值(例如0.333333333,具体取决于精度)。