假设我有以下两个查询:
select sum(cast(2666 as float)) * cast(.3 as float)
select sum(cast(2666 as real)) * cast(.3 as real)
第一次查询返回:799.8
第二次查询返回:799.800031781197
为什么第二个查询不返回与第一个相同的东西?
假设我有以下两个查询:
select sum(cast(2666 as float)) * cast(.3 as float)
select sum(cast(2666 as real)) * cast(.3 as real)
第一次查询返回:799.8
第二次查询返回:799.800031781197
为什么第二个查询不返回与第一个相同的东西?
二进制浮点类型(如实数和浮点数)不能准确表示十进制数。特别是不可能将 0.3 精确地存储为二进制浮点数。而是存储了一个非常接近 0.3 的数字。这称为表示错误。
real 和 float 的误差大小不同,因为它们具有不同的精度。
如果您想更准确地存储十进制数字,请考虑使用decimal 或 numeric。但请注意,即使这些类型可以准确地存储一定位数的十进制值,计算仍然会产生无法精确表示的数字。例如,即使两者和可以,0.1 / 0.3
也不能将结果精确存储在 a中。在这种情况下,结果将四舍五入到可以存储在类型中的最接近的值(例如,取决于精度)。decimal
0.1
0.3
0.333333333