C#中的小数到浮点转换问题
本文关键字:转换 问题 小数 | 更新日期: 2023-09-27 17:59:16
有人能帮我解决这个问题吗?
我在数据库中有一个可以为null的"real"列,实体框架将其表示为"float?"
系统以十进制进行一些计算,但当分配此列中的值时,精度会丢失。
系统正在使用下一个转换:
dbObject.floatCol = (float) decimalVar;
decimalVar=123.12341
但dbObject.floatCol=123.1234
我一直在尝试用其他方式进行转换,但没有运气。
注意:
- 在数据库中,我可以毫无问题地将值更新为123.12341
- 我无法更改数据库的列
- 我正在使用Visual Studio 2010和.NET Framework 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
这种行为真的很奇怪
我需要知道是否可以进行正确的转换
当我尝试将值打印到控制台或日志文件时,它们是不同的:s
您将获得大约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数据类型映射
关于您的EDIT:float
和double
的值在内部具有浮点数的二进制表示,这需要将十进制数四舍五入到最接近的匹配二进制值。然后将该二进制值转换回十进制表示形式以供显示。根据值是向上取整还是向下取整,这可能会添加或删除小数。这就是你所经历的。
请参阅Jon Skeet关于二进制浮点和.NET 的文章