我有一个存储金额并在gridview中显示的数据库。我有一个输入为3,594,879.59的金额,当我查看gridview时,我得到3,594,880.00。
SQL Money类型是默认的Money,在创建表以自定义Money类型时,SQL中没有任何操作。在Linq,我将金额投入浮动?
是什么导致这种情况发生?它只发生在大数字上(例如我在数据库中放1.5,在gridview中放1.5)。
答案 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位数。