2010-02-12 195 views
1

我做了一个查询到SQL Server通过存储过程来得到一些数据,返回值是这样的:Convert.ToSingle四舍五入

10219150 

然后,在组件(我没有源代码该组件的,我所反射的文件以查看代码)有人这样写:

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

所以,当我调用它执行最终转化该方法中,它返回这个值:

1.021315E+7 

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

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

从这:1.021315E + 7要这样:10219150再次(恢复而没有转化为修正值)

希望我自己清楚。

在此先感谢。

回答

1

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

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

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

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

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

将打印的数量为:

"10,219,150.00" 

为了让没有小数位使用"{0:N0}"的格式字符串。

+0

这就是我打印的值:String.Format(“{0:0,0}”,Convert.ToDouble(1.021315E + 7)),在正面看起来像这样:10.219.150.000.000 ??我从来没有使用过Convert.ToSingle,所以这就是为什么我不明白这种行为。 – lidermin 2010-02-12 12:43:43

+0

非常感谢!你让我今天一整天都感觉很好。 – lidermin 2010-02-12 13:25:10

0

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

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

fvalue.ToString("f0"); 

以整数形式显示,而不是以科学计数法显示。

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

如果精度的损失很重要,那么你很可能需要从数据库中获取值作为long或者作为双精度值(取决于返回的数据类型。)这些类型中的每一个都可以保存更有效的数字。

0

当该值转换为Single时,它会进行四舍五入,因为它包含更多有效数字,可以放入Single。如果您将10213153转换为Single,那么您最后也会得到1.021315E+7,即10213150

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

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