tostring(“000.0”)生成错误的值

时间:2013-04-02 16:02:51

标签: c# string tostring

在我的c#控制台应用程序中,我想将double变量转换为字符串类型。但是结果字符串变量应该至少有3位数到小数点左边和一位数到右边。 例如:3.4569应转换为“003.4”

它适用于上面的示例,但是后续转换会产生错误的结果。

 double Num = Math.Pow((3 + Math.Sqrt(5)), N); //6578336356630531.0 for N=22
 string StringNum = Num .ToString("000.0");

结果..

 StringNum ="6578336356630530.0";

但它会...... ..

 StringNum ="6578336356630531.0";

如何获得这些类型数字的确切字符串值?

 //decimal Num=Convert.ToDecimal (Math.Pow((3 + Math.Sqrt(5)), N));
 //this conversion also looses original value

感谢名单..

6 个答案:

答案 0 :(得分:3)

问题在于您正在存储的值 正是6578336356630531。没有double值更接近6578336356630530.因此输出对于执行时出现的数据是正确的。

来自the documentation

  

所有浮点数也具有有限的有效位数,这也决定了浮点值接近实数的精确程度。 Double值最多包含15个十进制数字的精度,但内部最多保留17位数。

你正在讨论第16位数字。

我有一个handy class,可让您查看任何double完全值。

如果您需要更高的精确度,请使用decimal代替double。请注意,decimal范围较小,但精度较高。

答案 1 :(得分:2)

你能用小数吗?

decimal Num = 6578336356630531.0M;
string StringNum = Num .ToString("000.0");

double是一个近似精度的浮点数。 See here.

文章摘录:

  

浮点值和精度损失

     

请记住a   浮点数只能近似一个十进制数,那就是   浮点数的精度决定了准确度   该数字近似于十进制数。默认情况下,为Double值   包含15个十进制数字的精度,但最多为17   数字在内部维护。浮点精度   数字有几个结果:两个浮点数   对于特定精度看起来相等可能不等于相等   因为他们的最低有效数字是不同的。数学   或使用浮点数的比较操作可能不会   如果使用十进制数,则产生相同的结果,因为   浮点数可能不完全接近小数   数。如果浮点数是,则值可能不会往返   参与其中。如果操作转换了一个值,则称该值为往返   原始浮点数到另一种形式,反向运算   将转换后的表单转换回浮点数,然后转换为   最终浮点数等于原始浮点数   数。往返可能会失败,因为一个或多个最不重要   数字在转换中丢失或更改。

答案 2 :(得分:0)

使用decimal代替double,一切正常:

decimal Num = 6578336356630531.0m;
string StringNum = Num.ToString("000.0");

问题与双值表示和精度有关。

答案 3 :(得分:0)

double无法存储该精度。如果这是您想要的行为,请使用decimal

答案 4 :(得分:0)

您似乎找到了一个无法正确表示浮点数的数字。

尝试使用小数代替:

decimal Num = 6578336356630531.0m;
string StringNum = Num.ToString("###.0");

答案 5 :(得分:0)

没有以双精度舍入的最大整数是2 ^ 53 - 1,大约是9e15,但是你有6e15,这可能可以很好地表示,但不一定。你运气不好(通常是运气不好;处理它)。如果你想在没有这些惊喜的情况下生活,你必须在c#中使用十进制类型。