SQL Real vs Float

Col*_*e W 8 sql sql-server

假设我有以下2个查询:

select sum(cast(2666 as float)) * cast(.3 as float)
select sum(cast(2666 as real)) * cast(.3 as real)
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ers 19

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

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

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

  • 是的,正如1/3是十进制的重复数字(0.333333 ..永远),它也是二进制的:0.01010101010101 ---永远.但是,十进制中的一些非重复数字(如0.1)会以二进制形式重复出现.例如0.1dec = 0.0001100110011 ...永远是二进制的,因此无法准确表示. (3认同)