作为float的TSQL Money是精确的四舍五入

时间:2010-12-06 17:49:51

标签: sql linq-to-sql currency

我有一个存储金额并在gridview中显示的数据库。我有一个输入为3,594,879.59的金额,当我查看gridview时,我得到3,594,880.00。

SQL Money类型是默认的Money,在创建表以自定义Money类型时,SQL中没有任何操作。在Linq,我将金额投入浮动?

是什么导致这种情况发生?它只发生在大数字上(例如我在数据库中放1.5,在gridview中放1.5)。

2 个答案:

答案 0 :(得分:2)

将SQL money类型转换为CLR类型decimal。 Decimal是一个浮点数字类型,它使用base-10内部表示,因此可以表示范围内的任何十进制数而不是近似值。

它比浮动慢,而且你的交易范围是精确的,但是对于涉及金钱的任何事情,使用十进制来避免近似误差。

编辑:至于“为什么会发生这种情况” - 有两个原因。首先,浮点数使用base-2内部表示,其中不可能精确地表示一些小数部分。其次,浮点数称为浮点的原因是,它不是对整数部分使用固定精度而是对小数部分使用固定精度,而是在幅度和精度之间提供连续的折衷。积分部分相对较小的数字(如1.5)允许将大部分内部表示分配给小数部分,从而提供更高的精度。随着积分部分的幅度增加,现在需要先前用于精度的位来存储更大的整数值,因此分数部分的精度会受到影响。

非常非常粗略地说,它就像有十位数,你可以把小数点放在任何你想要的地方,所以对于小值,你可以代表非常准确的分数:

1.0000000123

但是对于较大的值,您几乎没有可用的分数精度:

1234567890.2

有关此实际的工作原理的详细信息,请查看IEEE 754标准。

答案 1 :(得分:1)

如果目的地是标准的32位浮点数,那么你就得到了你应该得到的。尝试将其保留为金钱,或将其更改为缩放整数或双精度(64位)浮点。

32位浮点数具有六到七位有效精度。 64位浮点数的精度只有16位数。