EF 检索到不正确的小数精度

Posted

技术标签:

【中文标题】EF 检索到不正确的小数精度【英文标题】:EF retrieves incorrect decimal precision 【发布时间】:2016-01-13 19:21:01 【问题描述】:

我使用的是 Entity Framework 6.1,代码优先。我正在尝试从 SQL Server 存储/检索小数,但未检索到正确的精度。我从 .csv 文件中读取数据,处理数据,然后插入数据库。

.csv 文件中的值:1.1390 从导入保存为decimal 时的值:1.1390 插入 DB 的值:1.139 SSMS 中实际存储/显示的值:1.1390 手动运行 SQL Profiler 为检索捕获的查询时的值:1.1390 EF 检索到的值:1.1300

除了检索值之外,一切正常。我已经尝试过其他所有 SO 帖子(如下)中给出的解决方案,但它没有效果。这里出了什么问题?如何以适当的精度检索正确的值?

假设的解决方案:

modelBuilder.Entity<ClassA>().Property(p => p.MyDecimal).HasPrecision(19, 4);

检索方法,返回类型ClassA,精度不正确:

_poRepository.Table.FirstOrDefault(p => p.CompNumberA == compNum && 
                                        p.LineNumber == lineNumber);

两个十进制值的比较:

import.MyDecimal != dbValue.MyDecimal

ClassA:

public class ClassA

    // properties
    public virtual decimal MyDecimal  get; set; 

【问题讨论】:

您如何查看精度“1.1300”? 你还没有说你正在使用什么 EF 方法,例如Code First,你还没有展示你的模型。如果没有关键信息,似乎任何人都无法提供帮助 @BradleyUffner 我会检查从数据库返回的值与从 .csv 文件中给出的值是否存在差异。比较表明它们是不平等的。当我在断点处查看变量时,Visual Studio 将值显示为 1.1300 你能显示进行比较的代码吗? @BradleyUffner Just import.MyDecimal != dbValue.MyDecimal. 【参考方案1】:

原来我需要以相同的方式指定精度,但在 ClassA 的流畅映射中。在OnModelCreating() 中指定它并没有这样做,但在流畅的映射中指定了它。具体来说:

Property(u => u.MyDecimal).HasPrecision(19, 4);

【讨论】:

【参考方案2】:

在 Entity Framework Core 中你可以这样做:

[Column(TypeName = "decimal(19,4)")]
public decimal MyDecimal  get; set; 

【讨论】:

以上是关于EF 检索到不正确的小数精度的主要内容,如果未能解决你的问题,请参考以下文章

在显示时从配置表和格式中检索小数精度 - s-s-rS

Entity Framework Core - 将小数精度和小数位数设置为所有小数属性[重复]

js 浮点小数计算精度问题 parseFloat 精度问题

SQL Server 地理:减小 WKT 文本的大小(小数精度)

无法理解 DBMS 中数值数据类型的精度和小数位数

单精度、双精度各有几位小数?