C# 双类型属性(类)和双类型字段(SQL查询)中浮点数表示方式的差异

C# 双类型属性(类)和双类型字段(SQL查询)中浮点数表示方式的差异,c#,sql,ms-access,precision,linq2db,C#,Sql,Ms Access,Precision,Linq2db,我有一个表示特定数据库表的类。此类中的某些属性以及数据库表中的某些字段的类型为double 在这个类中,您可以看到一些属性有一个有效数字,例如T12、T13、T18、T19(0.8、12.1等) 但是,当我将此类插入数据库表时,Linq2Db会生成这样一个查询: 当我查看数据库表时,字段包含正确的一位有效数字值: 我非常清楚浮点数是如何以二进制格式表示的。我已经读过这篇文章了 我的问题是: 为什么类中的双类型重复(T12=-0.8)与“Linq2Db”操作后的表示(T12=-0.800…0

我有一个表示特定数据库表的类。此类中的某些属性以及数据库表中的某些字段的类型为double

在这个类中,您可以看到一些属性有一个有效数字,例如T12、T13、T18、T19(0.8、12.1等)

但是,当我将此类插入数据库表时,
Linq2Db
会生成这样一个查询:

当我查看数据库表时,字段包含正确的一位有效数字值:

我非常清楚浮点数是如何以二进制格式表示的。我已经读过这篇文章了

我的问题是:

  • 为什么类中的双类型重复(T12=-0.8)与“Linq2Db”操作后的表示(T12=-0.800…004)不同

  • 在数据库中保存这样的双值安全吗?(我希望避免出现不准确的值)

  • 为什么查询中的值和数据库表中的值之间存在差异

  • 编辑1: 这是对数据库进行查询的结果。15位有效数字(全部为0)与17位有效数字(屏幕上方)。Access显示的数字不能超过15位

    编辑2:
    为什么类中的double type可以是0.8,但没有任何操作或算术运算的相同值会作为0.800000000000004插入到数据库中?“Linq2Db”的作用是什么?

    如果您想要精确表示十进制值,请切换到
    decimal
    而不是浮点表示

    像0.8这样的数字不能使用固定数量的二进制十进制数字精确表示(但是,可以使用0.5和0.75)。您实际看到的内容取决于显示结果的应用程序,而不是它的存储方式


    因此,只需使用与您真正想要的数据类型相对应的定点小数。

    linq2db使用17位有效数字将双精度值表示为十进制SQL文字,因为它是允许您将双精度值往返到十进制表示并安全返回的最小位数


    在您的情况下,这是不必要的,因为Access(和Excel BTW)不支持超过15位有效数字的双精度类型。

    可能,完整值存储在数据库中。当显示一个有效数字时,存储完整值。尝试查询回该值,可能会插入相同的值Linq2Db。如果您想以一定的精度存储特定的值,我建议在使用Access和mdb文件时使用
    Decimal
    数据类型或
    Currency
    数据类型。这里“安全”的定义是什么?如果你不想要不精确,那么就不要选择浮动。使用
    decimal
    类型,但要了解性能上存在细微差异,这是您为了数据准确性而牺牲的。查询数据后,我看到的是以0结尾的完美四舍五入值。唯一的区别是Ms Access最多可以在点后显示15位数字,其中Visual Studio的屏幕显示17位数字,最后一位数字不同于0。请参见此处:。
    Decimal               0.8
    Class Double          0.8
    Floating-Point Double 0.8000000000000000444089209850062616169452667236328125
    Floating-Point Single 0.800000011920928955078125 (for comparison)
    SQL Query             0.80000000000000004 (!)  => 17 digits after point (why?)
    MS Access             0.800000000000000 = 0.8  => 15 digits after point