【问题标题】:0.3 is converted to 0.300000011920929 in SQL Server when adding from .NET Entity Framework [duplicate]从 .NET Entity Framework 添加时,0.3 在 SQL Server 中转换为 0.300000011920929 [重复]
【发布时间】:2021-07-11 09:49:31
【问题描述】:

我在 SQL Server 中有一个表,其中有一个数据类型为 float 的列。我写了一个用于插入记录的存储过程,它也接受参数为float

但是 Entity Framework 生成了数据类型为 double 的方法。因此,当我从 .NET 客户端添加 0.3 时,它会更改为 0.300000011920929 但是我需要添加我添加的确切值,即 0.3。

任何想法如何解决这个问题?

谢谢。

【问题讨论】:

标签: .net sql-server entity-framework numeric


【解决方案1】:

在 SQL 中,与其他语言一样,float 数据类型不能用于存储精确的 base10 十进制值,因为 float 并不总是具有精确的表示形式 (https://blog.greglow.com/2018/01/15/sql-newbie-mistake-1-using-float-instead-decimal/ )。尝试改用 decimal 数据类型,它在 SQL 中旨在精确存储十进制值。

另见Is floating point math broken?

【讨论】:

  • 当然它们可以用来存储精确值,它们只需要是base2小数(例如0.5或0.25十进制),而0.3(十进制)不是
  • @Charlieface,说得好。我已经相应地编辑了答案
  • 当我使用插入语句插入记录时,它会插入确切的值,但在 .NET 中它是用双精度数据类型映射的,因此近似值是从 .NET 客户端传递的。跨度>
  • 嗨@Charlieface,我不明白这一点,你能详细说明一下吗?在这个阶段很难将数据类型从浮点数更改为十进制,有没有其他方法可以保持浮点数据类型并存储确切的值?
  • @MuhammadUsamaAlam 请阅读浮点数学的工作原理。您没有插入确切的值,因为您拥有的值在浮点中没有精确的表示,在 .NET 或 SQL 中都没有。如果要存储精确的小数,请使用 decimal 类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2017-10-23
相关资源
最近更新 更多