c# - 双类型属性(类)和双类型字段(SQL查询)中浮点数表示的差异
问题描述
我有一个代表特定数据库表的类。该类中的某些属性以及数据库表中的某些字段是双精度类型。
在这里,在课堂上,您会看到一些属性具有 1 个有效数字,例如。T12、T13、T18、T19(0.8、12.1 等)。
但是,当我执行将此类插入数据库表时,Linq2Db
会产生这样的查询:
当我查看数据库表时,字段包含正确的一位有效数字值:
我完全知道浮点数是如何以二进制格式表示的。我已经阅读文章为什么浮点数不准确?.
我的问题:
为什么类中的双重类型表示(T12 = -0.8)与“Linq2Db”操作后的表示不同(T12 = -0.800...004)?
在数据库中保存这样的双重值是否安全?(我想防止值不准确)
为什么查询中的值和数据库表中的值之间存在差异?
编辑1:
这是数据库查询的结果。15 位有效数字(全 0)与 17 位有效数字(上图)。Access 不能显示超过 15 位数字。
编辑2:
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
为什么类中的双精度类型可以是 0.8,但是没有任何操作或算术运算的相同值插入到数据库中为 0.80000000000000004?'Linq2Db' 用它做什么?
解决方案
linq2db 使用 17 位有效数字将双精度值表示为十进制 SQL 文字,因为它是允许您将双精度值往返转换为十进制表示并安全返回而不会丢失精度的最小位数。
在您的情况下,没有必要,因为 Access(和 Excel BTW)不支持超过 15 个有效数字的双精度类型。
推荐阅读
- python - Tkinter 网格系统:排列元素
- python - python缺少1个必需的位置参数
- php - 未捕获的错误:在 C 中找不到类 'PHPMailer\PHPMailer\Exception'
- jmeter - 有没有办法以编程方式确定 JMeter 是否在“功能测试模式”下运行?
- python - 将数据列表列表转换为python中的矩阵(检查内部)
- html - Angular Material 表单字段外观填充大小
- arrays - 检查字符串是否缩写并复制完整的字符串。(Vba)
- javascript - 无法在 Express JS 应用程序上设置 IP 地址
- javascript - 如何“加载”另一个 HTML 文件?
- class - Python 的类接口设计可以在 Rust 中镜像吗?