C#中的小数到浮点转换问题

本文关键字:转换 问题 小数 | 更新日期: 2023-09-27 17:59:16

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

我在数据库中有一个可以为null的"real"列,实体框架将其表示为"float?"

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

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

dbObject.floatCol = (float) decimalVar;

decimalVar=123.12341

但dbObject.floatCol=123.1234

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

注意:

  1. 在数据库中,我可以毫无问题地将值更新为123.12341
  2. 我无法更改数据库的列
  3. 我正在使用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

C#中的小数到浮点转换问题

您将获得大约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:floatdouble的值在内部具有浮点数的二进制表示,这需要将十进制数四舍五入到最接近的匹配二进制值。然后将该二进制值转换回十进制表示形式以供显示。根据值是向上取整还是向下取整,这可能会添加或删除小数。这就是你所经历的。

请参阅Jon Skeet关于二进制浮点和.NET 的文章