【问题标题】:Decimal to Float conversion issue in C#C#中的小数到浮点数转换问题
【发布时间】:2016-12-03 09:22:07
【问题描述】:

谁能帮我解决这个问题?

我在数据库中有一个可以为空的“真实”列,实体框架表示为“浮点数?”

系统会以十进制进行一些计算,但是在分配此列中的值时会丢失精度。

系统正在使用下一次转换:

dbObject.floatCol = (float) decimalVar;

decimalVar = 123.12341

但是 dbObject.floatCol 是 = 123.1234

我一直在尝试以其他方式进行这种转换,但没有运气。

注意事项:

  1. 在数据库中,我可以毫无问题地将值更新为 123.12341。
  2. 我无法更改数据库的列
  3. 我正在使用带有 .NET Framework 4 的 Visual Studio 2010

编辑:
如果我调试问题(使用问题的真实数字),我有:

decimal decimalVar = new decimal(123.13561);
// decimalVar is 123.13561
float? floatVar = 0;
// floatVar is 0
floatVar = (float)decimalVar;
// floatVar is 123.135612 <- has appeared a 2 at the end

// with a different decimal number
decimalVar = new decimal(128.13561); // replaced the 123 for 128
// decimalVar is 128.13561
floatVar = (float)decimalVar;
// floatVar is 128.1356 <- has disappeared the 1 at the end

这种行为真的很奇怪
我需要知道是否可以进行正确的转换
当我尝试将值打印到控制台或日志文件时,它们是不同的:s

【问题讨论】:

  • C#和SQLServer的类型映射可以找到here

标签: c# .net type-conversion decimal


【解决方案1】:

您获得了大约 7 位的精度。这是您可以从 C# float 中得到的。如果您需要更高的精度,请改用 C# double 值。它为您提供大约 15 到 16 位的精度。

double d = (double)decimalVar;

您还必须区分 C# 数据类型和数据库数据类型。在 C# 中,在 db decimal 列中读取的最佳数据类型是 decimal

根据数据库类型,数字列类型使用不同的名称。这些名称与 C# 类型不同。 SQL-Server float 对应于 C# double。 SQL-Server real 对应于 C# float (.NET Single)。

见:SQL Server Data Type Mappings

关于您的编辑:floatdouble 值在内部以二进制表示为浮点数,这需要将十进制数四舍五入为最接近的可能匹配二进制值。然后将此二进制值转换回十进制表示以供显示。根据值是向上还是向下舍入,这可能会添加或删除小数。这就是你所经历的。

请参阅 Jon Skeet 在 Binary floating point and .NET 上的文章

【讨论】:

  • 感谢您的回答,我想我除了更改数据库类型别无选择。奇怪的是:我可以将数据库中的值更新为 123.12341,我可以定义一个 float var = 123.12341f,但不能正确地进行从十进制到浮点的转换。
  • 这也取决于使用的格式。 Mabe 号码仍然存储了最后一个1,但默认情况下不显示。尝试通过明确指定数字来显示转换后的值:x.ToString("0.000000")
  • @MiguelValdes:您可以在代码中定义一个比实际数字更精确的文字浮点数。如果你输出123.12341f的结果,你会看到它仍然只是123.1234
  • @StriplingWarrior 解释了奇怪的行为。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多