Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# tostring(“000.0”)生成错误的值_C#_String_Tostring - Fatal编程技术网

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

C# tostring(“000.0”)生成错误的值,c#,string,tostring,C#,String,Tostring,在我的c#控制台应用程序中,我想将双变量转换为字符串类型。但结果字符串变量应该在小数点左边至少有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 ="657833

在我的c#控制台应用程序中,我想将双变量转换为字符串类型。但结果字符串变量应该在小数点左边至少有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

Thanx..

使用
十进制
而不是
双精度
,一切正常:

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

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

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

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

发件人:

所有浮点数的有效位数也有限,这也决定了浮点数逼近实数的精度。双精度值的精度最高为15位小数,但内部最多保留17位小数

你在琢磨第16位数字

我有一个可以让你看到任何
double
的精确值的


如果需要更高的精度,请使用
decimal
而不是
double
。请注意,
decimal
的范围较小,但精度较高。

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

请尝试改用十进制:

decimal Num = 6578336356630531.0m;
string StringNum = Num.ToString("###.0");
你能用十进制吗

decimal Num = 6578336356630531.0M;
string StringNum = Num .ToString("000.0");
double
是近似精度的浮点

文章节选:

浮点值和精度损失

记得吗 浮点数只能近似于一个十进制数 浮点数的精度决定了精度 那个数字近似于十进制数。默认情况下,一个双精度值 包含15位精度的十进制数字,但最大值为17 数字在内部维护。浮点的精度 数字有几个后果:两个浮点数 特定精度的“显示相等”可能与“比较相等” 因为它们的最低有效位是不同的。数学模型 或者使用浮点数的比较操作可能不会 如果使用十进制数,则产生相同的结果,因为 浮点数可能与十进制数不完全接近 号码。如果使用浮点数,则值可能不会往返 卷入的如果某个操作转换了 将原始浮点数转换为另一种形式,进行逆运算 将转换后的表单转换回浮点数,然后 最终浮点数等于原始浮点数 号码。往返可能会失败,因为一个或多个最不重要的 数字在转换过程中丢失或更改

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

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

看来你正处于精确的边缘。尝试
if(6578336356630531.0==6578336356630530.0)Console.WriteLine(“精度问题”)我得到N=22作为输入,然后我使用N作为以下内容,Num=Math.Pow((3+Math.Sqrt(5)),N)//6578336356630531.0那么对于数学函数,我使用了双变量…@durgesh.patle kay bhau,tya yed***ghabarun tumhi post delete kelit?哦,玛拉蒂啊,图米·玛拉蒂……。@durgesh.patle hi,aapali,hakkachi聊天室啊,我的朋友们,我是马哈拉施特拉·纳瓦尼曼senechaaaa@Freelancer:…vijay aso,ghabarun post delete nahi keli bhau,-ve points mule post delete keli.,聊天室chya mahitisathi dhanyawad..我将N作为输入,然后使用N,如下所示,Num=Math.Pow((3+Math.Sqrt(5)),N)//6578336356630531.0表示N=22,因此对于数学函数,我使用了双变量。.错误:不舍入的最大精度为2^52-1,这会使您的数字超出限制,这不是运气,它肯定会被舍入。Thanx先生,但我得到N=22作为输入,并使用如下,Num=Math.Pow((3+Math.Sqrt(5)),N)//6578336356630531.0所以对于数学函数,我使用了双变量,不能使用pow或sqrtdecimal@durgesh.patle:您只需了解,如果您使用的是
双精度
,则应忽略第15位有效数字以外的任何内容。你想要得到的数字基本上是无法用double来表示的。