float
和double
是floating binary point types.换句话说,它们代表这样一个数字:
10001.10010110011
二进制数和二进制点的位置都编码在该值内.
decimal
是floating decimal point type.换句话说,它们代表这样一个数字:
12345.65789
同样,decimal点的数字和位置都在该值中进行了编码,这使得decimal
仍然是浮点类型,而不是定点类型.
需要注意的重要一点是,人类习惯于用十进制形式表示非整数,并期望用十进制数表示精确的结果;并不是所有的十进制数都可以精确地用二进制浮点表示(例如0.1),所以如果使用二进制浮点值,实际上会得到0.1的近似值.当使用浮动小数点时,您仍然会得到近似值-例如,1除以3的结果不能精确表示.
至于在以下情况下使用什么:
对于"自然精确小数"的值,最好使用decimal
.这通常适用于人类发明的任何概念:金融价值是最明显的例子,但也有其他例子.例如,考虑到潜水员或溜冰运动员的得分.
对于那些更像是自然产物的价值,无论如何也无法真正测量exactly,float
/double
更合适.例如,科学数据通常以这种形式表示.在这里,原始值从一开始就不是"小数精度",因此保持"小数精度"对预期结果并不重要.使用浮点二进制类型比使用小数要快得多.