Answers:
仅当十进制(最多38位)提供的精度不足时才使用浮点或实数数据类型
因此通常来说,因为如果您的数字可以容纳,则十进制提供的精度为[10E38〜38位数],并且较小的Float存储空间(可能还有速度)并不重要,处理异常行为和近似数值类型的问题也不重要可接受,通常使用Decimal。
更有用的信息
主要来源: MCTS自定进度培训套件(考试70-433):Microsoft®SQLServer®2008数据库开发 -第3章-表,数据类型和声明性数据完整性第1课-选择数据类型(指南)-第93页
use the float or real data types only if the precision provided by decimal is insufficient
-我认为实数少然后十进制是准确的,那么如果十进制不足,您怎么写才能使用实数?
decimal
很好了。这是20的精度。如果您需要在1e20和1e-20之间存储值,那么decimal
就不能这样做。那是40位数的精度。您永远无法在同一decimal
字段中存储1e20和1e-20 。相反,您可以使用float
,将所有内容内部存储为2的对数。这可以在一个字段中提供所有范围的精度,但缺点是只有前8位数字才是准确的。
float
...”-说谁?这是报价还是您的意见?
MSDN指南:使用十进制,浮点和实数据
数字和十进制数据类型的默认最大精度为38。在Transact-SQL中,数字在功能上等效于十进制数据类型。当必须完全按照指定的方式存储数据值时,请使用十进制数据类型存储带小数的数字。
float和real的行为遵循有关近似数字数据类型的IEEE 754规范。由于float和real数据类型的近似性质,因此在需要精确的数字行为时(例如,在金融应用程序中,涉及舍入的操作中或在相等性检查中),请勿使用这些数据类型。而是使用整数,十进制,货币或小货币数据类型。避免在WHERE子句搜索条件中使用浮点或实数列,尤其是=和<>运算符。最好将浮点数和实数列限制为>或<比较。
Scale
列中指定(固定)小数位数。
numeric
因为它永远不会以比您要求的精度更高的精度存储:请参阅stackoverflow.com/a/759606/626804
不是完整的答案,而是有用的链接:
“我经常针对十进制值进行计算。在某些情况下,在进行任何计算之前,将十进制值强制转换为ASAP浮点数会产生更好的精度。”
decimal
和float
是不同的。小数通过增加精度或小数位数来尽可能地防止下溢。但是,一旦达到十进制的有效位数限制,下溢将保持静音(并且精度会丢失)。浮点数可能具有更大范围的比例尺,而比例尺限制实际上是造成下溢的原因。因此,浮子可以具有更好的比例。但是,它仍然是不精确的类型。
小数具有固定的精度,而浮点具有可变的精度。
编辑(无法阅读整个问题):Float(53)(又名实数)是SQL Server中的双精度(32位)浮点数。常规浮点数是单精度浮点数。对于许多计算而言,Double是精度和简单性的良好组合。您可以使用十进制创建一个非常高精度的数字(最大136位),但是还必须注意正确定义精度和小数位数,以便它可以将所有中间计算包含到所需的位数。
浮点数是“近似数字”数据类型,这意味着不能准确表示该数据类型范围内的所有值。
十进制/数字是固定精度数据类型,这意味着可以使用精度和小数位数精确表示数据类型范围内的所有值。您可以使用十进制来省钱。
从十进制或数字转换为浮点数可能会导致精度损失。对于Decimal或Numeric数据类型,SQL Server将精度和小数位的每种特定组合视为不同的数据类型。DECIMAL(2,2)和DECIMAL(2,4)是不同的数据类型。这意味着11.22和11.2222是不同的类型,尽管float并非如此。对于FLOAT(6),11.22和11.2222是相同的数据类型。
您也可以使用money数据类型来省钱。这是本机数据类型,具有4位数的精度。大多数专家都喜欢使用这种数据类型来省钱。
它的基本需求是什么?
它源于以下事实:计算机最终在内部以二进制格式表示数字。这不可避免地导致舍入错误。
考虑一下:
0.1 (decimal, or "base 10") = .00011001100110011... (binary, or "base 2")
上面的省略号表示“无限”。如果仔细看,会有无限的重复模式(='0011')
因此,在某些时候计算机必须舍入该值。这会导致由于重复使用不准确存储的数字而导致的累积错误。
假设您要存储财务金额(可能是小数的数字)。首先,您显然不能使用整数(整数没有小数部分)。从纯粹的数学观点来看,自然的趋势是使用float
。但是,在计算机中,浮点数是位于小数点后的数字部分(“尾数”)的限制。这会导致舍入错误。
为克服此问题,计算机提供了特定的数据类型,这些数据类型限制了计算机中十进制数字的二进制舍入错误。这些是绝对应用于表示财务金额的数据类型。这些数据类型通常使用的名称Decimal
。例如,在C#中就是这种情况。或者,DECIMAL
在大多数数据库中。
尽管问题不包括MONEY数据类型,但遇到此线程的某些人可能会倾向于使用MONEY数据类型进行财务计算。
注意MONEY数据类型,它的精度有限。
这个Stackoverflow问题的答案中有很多很好的信息: