Convert.ToSingle四舍五入

时间:2010-02-12 12:34:56

标签: c# sql-server

我向SQL Server发出查询以通过存储过程获取一些数据,返回值为:

10219150

然后,在一个程序集中(我没有该程序集的源代码,我反映了该文件以查看代码)有人写了这个:

Amount = Convert.ToSingle(10219150); //the value from the stored procedure

因此,当我调用执行最终转换的方法时,它会返回此值:

1.021315E+7

怎么可能?为什么Convert.ToSingle会添加额外的小数位?我不明白。

当我调用程序集的方法时,有没有办法可以反转我的代码转换?我无法重写该汇编文件,因为它太大了,而且,如前所述,我没有源代码来修复转换。

从这个:1.021315E + 7再次到达:10219150(恢复没有转换的正确值)

希望我能说清楚。

提前致谢。

3 个答案:

答案 0 :(得分:1)

转换为单曲并不会增加额外的精确度。

10219150是1.021315E + 7(这是编写1.021315 * 10 7 的另一种方式。)

用于打印输出值的方法只是使用科学记数法来显示数字。

如果您要打印该号码,则需要设置formatting options

    float amount = Convert.ToSingle("10219150");
    string toPrint = string.Format("{0:N}", amount);

将数字打印为:

"10,219,150.00"

要获得无小数位,请使用"{0:N0}"作为格式字符串。

答案 1 :(得分:0)

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

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

fvalue.ToString("f0");

显示为整数,而不是科学记数法。

遗憾的是,更大的问题是单个精度浮点数只能保存7位有效数字,在您的示例中,您存储的数字为8.因此,最后一位数字可能会舍入。 (因为在你的情况下碰巧是0,所以可能没有注意到舍入。)

如果精度损失至关重要,您可能需要从数据库中获取值作为long或双精度值(取决于返回的数据类型)。这些类型中的每一种都可以容纳更多有效数字。

答案 2 :(得分:0)

当值转换为Single时,它会被舍入,因为它包含可以放在Single中的更多有效数字。如果您将10213153转换为Single,那么您最终也会使用1.021315E+7,即10213150

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

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