有人可以帮我解决这个问题吗?
我在数据库中有一个可以为空的"真实"实体框架表示为" float?"
的列系统以十进制进行一些计算,但是当在此列中指定值时,精度会丢失。
系统正在使用下一个转换:
dbObject.floatCol = (float) decimalVar;
decimalVar = 123.12341
但dbObject.floatCol = 123.1234
我一直试图以其他方式进行这种转换而没有运气。
注意:
编辑:
如果我调试问题(我的问题的真实数字)我有:
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
答案 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
关于您的编辑:float
和double
值在内部具有二进制表示形式作为浮点数,需要将十进制数舍入为最接近的匹配二进制值。然后将该二进制值转换回十进制表示以供显示。根据值是向上还是向下舍入,这可能会添加或删除小数。这就是你所经历的。
参见Jon Skeet关于Binary floating point and .NET
的文章