C#中的Decimal到Float转换问题

时间:2016-07-28 19:54:32

标签: c# .net type-conversion decimal

有人可以帮我解决这个问题吗?

我在数据库中有一个可以为空的"真实"实体框架表示为" float?"

的列

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

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

dbObject.floatCol = (float) decimalVar;

decimalVar = 123.12341

但dbObject.floatCol = 123.1234

我一直试图以其他方式进行这种转换而没有运气。

注意:

  1. 在数据库中,我可以毫无问题地将值更新为123.12341。
  2. 我无法改变数据库的专栏
  3. 我使用Visual Studio 2010和.NET Framework 4
  4. 编辑:
    如果我调试问题(我的问题的真实数字)我有:

    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
    

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

1 个答案:

答案 0 :(得分:2)

你的精确度约为7位数。这是您对C#float的期望。如果您需要更高的精度,请改用C#double值。它为您提供大约15到16位数的精度。

double d = (double)decimalVar;

您还必须在C#数据类型和数据库数据类型之间做出改变。在C#中,在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

的文章