C# 转换为单个舍入

C# 转换为单个舍入,c#,sql-server,C#,Sql Server,我通过存储过程查询SQL Server以获取一些数据,返回值如下: 10219150 然后,在一个程序集中(我没有该程序集的源代码,我反射了该文件以查看代码),有人编写了以下内容: Amount = Convert.ToSingle(10219150); //the value from the stored procedure 因此,当我调用进行最终转换的方法时,它返回以下值: 1.021315E+7 这怎么可能?为什么Convert.ToSingle会添加额外的十进制位置?我不明白 当

我通过存储过程查询SQL Server以获取一些数据,返回值如下:

10219150
然后,在一个程序集中(我没有该程序集的源代码,我反射了该文件以查看代码),有人编写了以下内容:

Amount = Convert.ToSingle(10219150); //the value from the stored procedure
因此,当我调用进行最终转换的方法时,它返回以下值:

1.021315E+7
这怎么可能?为什么Convert.ToSingle会添加额外的十进制位置?我不明白

当我调用该程序集方法时,是否有一种方法可以反转代码上的转换?我不能重写那个程序集文件,因为它太大了,而且,正如我前面提到的,我没有修复转换的源代码

从这个:1.021315E+7再次到这个:10219150(在不进行转换的情况下恢复正确的值)

希望我说清楚


提前感谢。

转换为单精度并没有增加额外的精度

10219150是1.021315E+7(这只是书写1.021315*107的另一种方式)

您用于打印值的方法只是使用科学符号来显示数字

如果要打印号码,则需要设置

将把号码打印为:

"10,219,150.00"

要不获取小数位数,请使用
“{0:N0}”
作为格式字符串。

转换为单数不会增加额外的精度

10219150是1.021315E+7(这只是书写1.021315*107的另一种方式)

您用于打印值的方法只是使用科学符号来显示数字

如果要打印号码,则需要设置

将把号码打印为:

"10,219,150.00"

要不获取小数位数,请使用
“{0:N0}”
作为格式字符串。

您有两个问题。一个很容易解决,另一个可能更难或不可能

正如ChrisF所说,1.021315E+7只是书写10219150的另一种方式。(科学记数法中的E+7部分意味着将小数点向右移动7位。)设置单精度值的格式时,可以使用

fvalue.ToString("f0");
显示为整数,而不是用科学符号表示

不幸的是,更大的问题是一个单精度浮点只能容纳7位有效数字,在您的示例中,您存储的是8位。因此,最后一位数字可以四舍五入。(因为在您的情况下它恰好是0,所以可能没有注意到舍入。)


如果精度损失非常严重,则可能需要从数据库中获取长精度值或双精度值(取决于返回的数据类型)。这些类型中的每一种都可以包含更多的有效数字。

您有两个问题。一个很容易解决,另一个可能更难或不可能

正如ChrisF所说,1.021315E+7只是书写10219150的另一种方式。(科学记数法中的E+7部分意味着将小数点向右移动7位。)设置单精度值的格式时,可以使用

fvalue.ToString("f0");
显示为整数,而不是用科学符号表示

不幸的是,更大的问题是一个单精度浮点只能容纳7位有效数字,在您的示例中,您存储的是8位。因此,最后一位数字可以四舍五入。(因为在您的情况下它恰好是0,所以可能没有注意到舍入。)


如果精度损失非常严重,则可能需要从数据库中获取长精度值或双精度值(取决于返回的数据类型)。这些类型中的每一种都可以包含更多的有效数字。

当值转换为
单精度值时,它是四舍五入的,因为它包含更多的有效数字,可以放入
单个
。如果您将
10213153
转换为
Single
,您也会得到
1.021315E+7
,即
10213150

由于代码使用
单个
存储金额,因此无法使其正确处理当前值。该金额不能正确地表示为单个


您必须使用较低的值,或者更改代码。

当值转换为
单个
时,它会四舍五入,因为它包含可以放入
单个
中的更多有效数字。如果您将
10213153
转换为
Single
,您也会得到
1.021315E+7
,即
10213150

由于代码使用
单个
存储金额,因此无法使其正确处理当前值。该金额不能正确地表示为单个


您要么使用较低的值,要么更改代码。

这就是我打印值的方式:String.Format(“{0:0,0}”,Convert.ToDouble(1.021315E+7)),前面看起来是:10.219.150.000.000??我以前从未使用过Convert.ToSingle,所以这就是我不理解这种行为的原因。这就是我打印值的方式:String.Format(“{0:0,0}”),Convert.ToDouble(1.021315E+7)),前面看起来是:10.219.150.000.000??我以前从未使用Convert.ToSingle,所以我不理解这种行为。