我发现了一个将字符串解析为浮点值的非常有趣的事情。情况是通过使用IDbReader从数据库获取字符串值。这是一个示例:
IDbReader myReader;
...
string sValue = myReader.GetValue(0).ToString(); // 12.339123 for example in VS debug and watch
// the content of sValue is what I want to be at this point, but...
Single fValue = Single.Parse(sValue);
// Now the fValue is 12.34!
如果我只测试Parse的常量字符串,Parse方法可以正常工作:
string sValue = "12.339123";
Single fValue = Single.Parse(sValue);
// Now the fValue is 12.339123!
我不确定为什么IDbReader的sValue内容无法解析为原始值(我可以从VS调试中看到)。它将浮点值舍入为小数点后2位数的浮点值。我怎样才能得到原始值?
如何才能获得完全相同的值?
我正在使用.Net 2.0
更新:我尝试使用GetXXX(如GetFloat或GetDecimal方法)直接获取浮点数/小数值。不幸的是,所有这些方法似乎都有类似的舍入问题。只有GetValue()和强制转换为字符串才能获得与数据库中完全相同的字符串值。我以为我可以在.Net端转换为浮点数或小数值,但Parse()在我的情况下失败了。我不确定为什么在Parse()中进行舍入。正如一些人建议的那样,值可能是VS调试,监视或日志引起的舍入。但是,当我尝试将浮点值放到文本框中时,它会舍入到小数点后的2位数。这真是一个令人沮丧的问题。
答案 0 :(得分:1)
我不确定你是如何看待该变量并看到12.34
的。如果我在LINQPad中执行以下操作:
Single.Parse("12.339123")
我得到12.33912
。如果我要它给我一个完整的往返精度字符串:
Single.Parse("12.339123").ToString("r")
我得到12.3391228
,它与12.339123
完全接近,因为你只需要单精度浮点值。
结论:您使用不精确的方法来检查变量的值。变量本身几乎肯定是好的,并且保持与浮点允许的值一样精确;只是调试器工具提示,观察窗口或日志库,或者你用来查看该值的任何东西,只显示少数数字。
答案 1 :(得分:0)
尝试这种方式:
string sValue = myReader.GetValue(0).ToString("F6");